I have code in OpenGL that uses
glReadPixels to copy the depth buffer to a CPU memory buffer:
glReadPixels(0, 0, w, h, GL_DEPTH_COMPONENT, GL_FLOAT, dbuf);
How do I achieve the same in Direct3D?
I have looked at a similar question which gives a solution for copying the color buffer. I've tried to write similar code to copy the depth buffer:
IDirect3DSurface9* d3dSurface; d3dDevice->GetDepthStencilSurface(&d3dSurface); D3DSURFACE_DESC d3dSurfaceDesc; d3dSurface->GetDesc(&d3dSurfaceDesc); IDirect3DSurface9* d3dOffSurface; d3dDevice->CreateOffscreenPlainSurface( d3dSurfaceDesc.Width, d3dSurfaceDesc.Height, D3DFMT_D32F_LOCKABLE, D3DPOOL_SCRATCH, &d3dOffSurface, NULL ); // FAILS: D3DERR_INVALIDCALL D3DXLoadSurfaceFromSurface( d3dOffSurface, NULL, NULL, d3dSurface, NULL, NULL, D3DX_FILTER_NONE, 0 ); // Copy from offscreen surface to CPU memory ...
The code fails on the call to
D3DXLoadSurfaceFromSurface. It returns the error value
So, is something wrong with my code? How can I copy the depth buffer contents?