2012-01-23 3 views
0

나는 씬을 텍스처로 렌더링 한 다음 그 텍스처와 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, &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)); 

그리고 여기에 질감과 표면의 초기화 다음과 같습니다 : 더 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

답변

1

코드를 올바르게 읽으면 mDepthSurface을 두 번 지우십시오 : 먼저 INITIAL HDR RENDER 섹션에있는 다음 DOF EFFECT에 두십시오. 두 번째 해제 전에 SetDepthStencilSurface을 수행하거나 해당 호출에서 D3DCLEAR_ZBUFFER을 설정하지 않아도됩니다. 그렇지 않은 경우 두 번째 클리어는 rootNode->Render()으로 렌더링되고 효과 시작시에는 모든 클리어 z 버퍼가 삭제됩니다.

+0

그래도 dx10 이전에 발견 된 깊이 버퍼 readback은 공식적으로 지원되지 않습니다. 왜냐하면 depthStencilBuffer의 메모리 형식은 그래픽 카드 제조업체에게 구현되지 않기 때문입니다. R32F 텍스처에서 깊이를 인쇄하는 셰이더를 사용하여 렌더링 패스를 수행하는 것이 좋습니다. – NGauthier

관련 문제