나는 씬을 텍스처로 렌더링 한 다음 그 텍스처와 depthBuffer를 후속 렌더링에서 사용하여 몇 가지 효과 (Depth Of Field, Bloom 등)를 적용합니다.다른 렌더링 패스의 렌더링의 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));
그리고 여기에 질감과 표면의 초기화 다음과 같습니다 : 더 ASSERT 트리거지는 않는 것을
// 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));
주 (여기
는 실제 코드 정확히 무엇이 나를 화나게하는지, 나는 어디서 볼 것인가의 표시로 약간의 실수를 원한다)Nic
그래도 dx10 이전에 발견 된 깊이 버퍼 readback은 공식적으로 지원되지 않습니다. 왜냐하면 depthStencilBuffer의 메모리 형식은 그래픽 카드 제조업체에게 구현되지 않기 때문입니다. R32F 텍스처에서 깊이를 인쇄하는 셰이더를 사용하여 렌더링 패스를 수행하는 것이 좋습니다. – NGauthier