2013-10-20 132 views
0

我試圖用DirectX 11建立一個Z緩衝區,但它不像預期的那樣工作。沒有Z緩衝區,就像你期望的那樣,它顯示了更接近的物體。緩衝區顯示一個空白屏幕,然後在移動時通過位閃爍,如this video所示。Directx 11 Z緩衝區沒有渲染和閃爍

這是我的Z緩衝區初始化。

// Create a Z buffer texture 
D3D11_TEXTURE2D_DESC tex2dDesc; 
ZeroMemory(&tex2dDesc, sizeof(tex2dDesc)); 

tex2dDesc.Width = width; 
tex2dDesc.Height = height; 
tex2dDesc.ArraySize = 1; 
tex2dDesc.MipLevels = 1; 
tex2dDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; 
tex2dDesc.SampleDesc.Count = sd.SampleDesc.Count; 
tex2dDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; 
tex2dDesc.Usage = D3D11_USAGE_DEFAULT; 

ID3D11Texture2D *pZBufferTexture; 
hr = g_pD3DDevice->CreateTexture2D(&tex2dDesc, NULL, &pZBufferTexture); 

if(FAILED(hr)) return hr; 

// Create the Z buffer 
D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; 
ZeroMemory(&dsvDesc, sizeof(dsvDesc)); 

dsvDesc.Format = tex2dDesc.Format; 
dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; 

g_pD3DDevice->CreateDepthStencilView(pZBufferTexture, &dsvDesc, &g_pZBuffer); 
pZBufferTexture->Release(); 


// Set the render target view 
g_pImmediateContext->OMSetRenderTargets(1, &g_pBackBufferRTView, g_pZBuffer); 

以下是在渲染中運行的內容。

g_pImmediateContext->ClearRenderTargetView(g_pBackBufferRTView, g_clear_colour); 

g_pImmediateContext->ClearDepthStencilView 
    (g_pZBuffer, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0); 

對於DirectX 11,我仍然是一個初學者,所以任何幫助將不勝感激。如果需要更多的代碼,我可以提供。

回答

0

您應該在設備創建時添加D3D11_CREATE_DEVICE_DEBUG標誌。如果框架中出現錯誤,您會發現關於輸出日誌中的原因的詳細線索。

另外,如果不使用模板,請不要創建模板緩衝區。現代GPU不會將信息存儲在深度緩衝區中,D32格式不會浪費8位精度。