2011-09-04 78 views
1

是否可以通过DX 9.0c中的像素着色器2.0访问深度缓冲区?我google'd了一下,我发现唯一的解决办法形容GPU黑客工具,只能在GeForce 6 & 7.如何访问DirectX 9.0像素着色器中的深度缓冲区c

我想实现是写场着色效果深度。我不能简单地抓住顶点的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)

回答

2

在那里我所知没有标准化的做法,因为你正在努力做到这一点。 你最好用D3DUSAGE_RENDERTARGET创建一个D3FMT_R32F(或其他)纹理,然后将深度写入它,就好像它是一个普通纹理(即从像素着色器中写入r分量的深度)。然后,您可以将该纹理用于任何您喜欢的目的,纯粹通过将其绑定到采样器并直接读取r值来使用任何像素着色器。

这就是说,尝试进入DirectX控制面板并设置自己调试运行时。您将看到由DirectX运行时向调试输出流发出的一吨有用的错误消息。没有理由不这样做,因为这样可以节省您对这类问题的很多麻烦。