Directx 正在为另一个渲染过程检索渲染的depthBuffer。(D3DX9)

Directx 正在为另一个渲染过程检索渲染的depthBuffer。(D3DX9),directx,direct3d,depth,d3dx,Directx,Direct3d,Depth,D3dx,我将场景渲染为纹理,然后在后续渲染中使用该纹理及其depthBuffer应用一些效果(景深、Bloom等) 问题是:我设法将DepthStencilBuffer设置为自定义曲面,并将场景渲染为纹理。场景渲染完美,没有深度问题。也就是说,当使用纹理(自定义曲面绑定到该纹理)时,所有深度值都正好为1.0 我怀疑调用设备->清除会影响错误的表面,但即使禁用它们,也无法修复任何问题 以下是实际代码: HRESULT hr = S_FALSE; VCND3D* renderer = static_cas

我将场景渲染为纹理,然后在后续渲染中使用该纹理及其depthBuffer应用一些效果(景深、Bloom等)

问题是:我设法将DepthStencilBuffer设置为自定义曲面,并将场景渲染为纹理。场景渲染完美,没有深度问题。也就是说,当使用纹理(自定义曲面绑定到该纹理)时,所有深度值都正好为1.0

我怀疑调用设备->清除会影响错误的表面,但即使禁用它们,也无法修复任何问题

以下是实际代码:

HRESULT hr = S_FALSE;

VCND3D* renderer = static_cast<VCND3D*>( VCNRenderCore::GetInstance() );
LPDIRECT3DDEVICE9 device = renderer->GetD3DDevice();

//device->EndScene();

VCNDXShaderCore* shaderCore = static_cast<VCNDXShaderCore*>( VCNDXShaderCore::GetInstance() );

VCNNode* rootNode = VCNNodeCore::GetInstance()->GetRootNode();

LPDIRECT3DSURFACE9 currentSurface;
device->GetRenderTarget(0, &currentSurface);

LPDIRECT3DSURFACE9 currentDepthBuffer;
device->GetDepthStencilSurface( &currentDepthBuffer );

///// INITIAL HDR RENDER : //////////////////////////////////////

hr = device->SetRenderTarget( 0, mInitialHDRSurface );
VCN_ASSERT( SUCCEEDED(hr) );

hr = device->SetDepthStencilSurface( mDepthSurface );
VCN_ASSERT( SUCCEEDED(hr) );

device->Clear(  0,
                NULL,
                D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                D3DCOLOR_XRGB(100,100,100),
                1.0f,
                0 );

//device->BeginScene();
rootNode->Render();
//device->EndScene();

//hr = device->UpdateSurface( currentDepthBuffer, NULL, mDepthSurface, NULL );
//VCN_ASSERT( SUCCEEDED(hr) );

//////////// DOF EFFECT : /////////////////////////////////////////////////

hr = device->SetRenderTarget( 0, currentSurface );
VCN_ASSERT( SUCCEEDED(hr) );

device->SetRenderState(D3DRS_COLORWRITEENABLE, 
D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE);

device->Clear(  0,
                NULL,
                D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                D3DCOLOR_XRGB(100,100,100),
                1.0f,
                0 );

//device->BeginScene();

// Set DOF shader
VCNDXShader* dofShader = shaderCore->GetShader( sidDof );

// Field of view to cover full screen :
hr = device->SetFVF(D3DFVF_SCREEN);
VCN_ASSERT( SUCCEEDED(hr) );

// select the vertex buffer to display
hr = device->SetStreamSource(0, mScreenVertexBuffer, 0, sizeof(SCREENVERTEX));
VCN_ASSERT( SUCCEEDED(hr) );

// Draw the Dof result
hr = dofShader->GetEffect()->SetTechnique( "BaseTechnique" );
VCN_ASSERT( SUCCEEDED(hr) );
hr = dofShader->GetEffect()->SetTexture( "gInputImageTexture", mInitialHDRTexture );
VCN_ASSERT( SUCCEEDED(hr) );
hr = dofShader->GetEffect()->SetTexture( "gDepthTexture", mDepthTexture );
VCN_ASSERT( SUCCEEDED(hr) );
hr = dofShader->GetEffect()->SetFloat( "gMinDepth", 3.0f );
VCN_ASSERT( SUCCEEDED(hr) );
hr = dofShader->GetEffect()->SetFloat( "gMaxDepth", 7.0f );
VCN_ASSERT( SUCCEEDED(hr) );

dofShader->RenderPrimitive( 2, D3DPT_TRIANGLESTRIP );

hr = device->SetDepthStencilSurface( currentDepthBuffer );
VCN_ASSERT( SUCCEEDED(hr) );
请注意,没有触发断言(这正是让我恼火的地方,我希望看到一些错误,以指示在何处查找)


Nic

如果我正确读取了您的代码,您可以清除
mDepthSurface
两次:首先在
INITIAL HDR RENDER
部分,然后在
DOF EFFECT
中。您需要在第二次清除之前执行
SetDepthStencilSurface
,或者在该调用中不设置
D3DCLEAR_ZBUFFER
。否则,second clear将丢弃由
rootNode->Render()
渲染的任何内容,并且在效果开始时,您拥有所有清除的z-buffer。

是的,但我发现在dx10之前,深度缓冲区回读不受正式支持,因为图形卡制造商不需要实现depthStencilBuffer的内存格式。似乎最好只使用在R32F纹理中打印深度的着色器进行渲染过程。
// Texture for the initial HDR Render (Before effects)
hr = device->CreateTexture(res.x, res.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT, &mInitialHDRTexture, 0);
VCN_ASSERT_MSG( SUCCEEDED(hr), _T("Unable to create initial HDR Render Texture") );

// Extract the associated surface for rendering
hr = mInitialHDRTexture->GetSurfaceLevel(0, &mInitialHDRSurface);
VCN_ASSERT( SUCCEEDED(hr) );

// Texture with depth of the scene
hr = device->CreateTexture(res.x, res.y, 1, D3DUSAGE_DEPTHSTENCIL, D3DFMT_D32F_LOCKABLE, D3DPOOL_DEFAULT, &mDepthTexture, 0);
VCN_ASSERT_MSG( SUCCEEDED(hr), _T("Unable to create depth texture") );

// Extract the associated surface for rendering
hr = mDepthTexture->GetSurfaceLevel(0, &mDepthSurface);
VCN_ASSERT( SUCCEEDED(hr) );