문제

장면을 텍스처로 렌더링한 다음 후속 렌더링에서 해당 텍스처와 해당 깊이 버퍼를 사용하여 일부 효과(피사계 심도, 블룸 등...)를 적용합니다.

문제는 다음과 같습니다.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) );

오류가 있을 수 있으므로 텍스처와 표면의 초기화는 다음과 같습니다.

// 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가 실행되지 않는다는 점에 유의하세요(정확히 이것이 나를 화나게 하는 것입니다. 어디를 봐야 할지 알려주는 오류가 있었으면 좋겠습니다).

도움이 되었습니까?

해결책

코드를 올바르게 읽으면 지워집니다. mDepthSurface 두 배:처음으로 INITIAL HDR RENDER 섹션, 다음 DOF EFFECT.당신은 SetDepthStencilSurface 두 번째 전에 지우거나 설정하지 않음 D3DCLEAR_ZBUFFER 그 통화에서.그렇지 않으면 두 번째 클리어는 렌더링된 내용을 모두 삭제합니다. rootNode->Render() 그리고 실제로 시작하면 모든 명확한 z-버퍼가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top