我渲染場景到紋理,然後使用紋理和深度緩存在隨後的渲染應用一些效果(景深,布魯姆,等...)。檢索另一個渲染過程的渲染的depthBuffer。 (D3DX9)
這裏的問題是:我管理的DepthStencilBuffer設置爲自定義表面和渲染我的場景到紋理。場景完美呈現,沒有深度問題。這就是說,當使用紋理(自定義表面被綁定到)時,所有深度值都精確爲1.0
我懷疑調用device-> clear會影響錯誤的表面,但即使禁用它們,它不能解決任何問題。
下面是實際的代碼:
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, ¤tSurface);
LPDIRECT3DSURFACE9 currentDepthBuffer;
device->GetDepthStencilSurface(¤tDepthBuffer);
///// 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));
而且這裏的質地和表面的初始化,因爲錯誤可能有:
// 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));
注意,沒有ASSERT是越來越觸發(這正是什麼讓我失望,我想要一些錯誤作爲指示在哪裏看)
Nic
是的,但我發現DX10之前,深度緩存回讀不正式支持,因爲depthStencilBuffer的存儲格式是免費實現的圖形卡製造商。看起來好像只是用着色器進行渲染過程比使用R32F紋理打印深度更好。 – NGauthier