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

时间:2011-09-04 07:45:30

标签: direct3d pixel-shader zbuffer

是否可以通过DX 9.0c中的像素着色器2.0访问深度缓冲区?我已经google了一点,我发现的唯一解决方案描述了GPU hack只适用于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)的纹理

1 个答案:

答案 0 :(得分:2)

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

那说尝试进入DirectX控制面板并设置自己调试运行时。您将看到DirectX运行时向调试输出流中输出了大量有用的错误消息。没有理由不这样做,因为它可以为你节省很多麻烦。