如何在DirectX 9.0 c中访问像素着色器中的深度缓冲区



是否可以在DX 9.0c中通过像素着色器2.0访问深度缓冲区?我在谷歌上搜索了一下,我找到的唯一解决方案是描述GPU黑客只能在GeForce 6上工作。7 .

我想要实现的是写景深着色器效果。我不能简单地抓取顶点的Z轴,因为我也在做渲染到纹理的技巧,用于其他后期处理。

编辑:

我试过了:

D3DXCreateTexture(lpD3Dev9, width, height, 1, D3DUSAGE_DEPTHSTENCIL, D3DFMT_D24S8, D3DPOOL_DEFAULT, &lpD3DepthBuffer);
lpD3DepthBuffer->GetSurfaceLevel(0,&lpNewDepthBuffer);
lpD3Dev9->GetDepthStencilSurface(&lpPrevDepthBuffer);
lpD3Dev9->SetDepthStencilSurface(lpNewDepthBuffer);
lpD3Dev9->BeginScene();
// Rendering...
lpD3Dev9->EndScene();
lpD3Dev9->SetDepthStencilSurface(lpPrevDepthBuffer);
// this function fails:
D3DXSaveTextureToFile("C:backBuffer.png", D3DXIFF_PNG, lpD3DepthBuffer, NULL);
lpD3Dev9->BeginScene(); 
UINT passes;
D3DXHANDLE tech;
lpD3DXfxScreen->FindNextValidTechnique(0, &tech);
lpD3DXfxScreen->SetTechnique(tech);
lpD3DXfxScreen->Begin(&passes,0);
lpD3DXfxScreen->SetTexture("texDepth", lpD3DepthBuffer);
// render shader...

SaveTextureToFile失败,着色器得到的纹理是纯白色RGB(1,1,1)

据我所知,当你试图这样做时,没有标准化的方法。你最好只是创建一个D3FMT_R32F(或任何)纹理作为D3DUSAGE_RENDERTARGET,然后写入深度到它,如果它是一个正常的纹理(即在像素着色器的r组件中写入深度)。然后你可以将纹理用于任何你喜欢的目的,仅仅通过将其绑定到采样器并直接读取它的r值来使用你正在摆弄的任何像素着色器。

也就是说,试着进入DirectX控制面板并设置自己调试运行时。你会看到大量有用的错误信息被DirectX运行时喷到调试输出流中。真的没有理由不这样做,因为它会为您节省很多麻烦,像这样的问题

相关内容

  • 没有找到相关文章

最新更新