【问题标题】:Directx 11 Z-Buffer not rendering and flickeringDirectx 11 Z-Buffer 不渲染和闪烁
【发布时间】:2013-10-20 00:39:05
【问题描述】:

我正在尝试使用 DirectX 11 设置 Z 缓冲区,但它没有按预期工作。如您所料,如果没有 Z-Buffer,它会在更近的对象之上显示更远的对象。使用缓冲区时,它会显示一个空白屏幕,然后在移动时闪烁位,如this video 所示。

这是我的 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,我还是个初学者,因此我们将不胜感激。如果需要更多代码,我可以提供。

【问题讨论】:

    标签: c++ directx directx-11 depth-buffer


    【解决方案1】:

    您应该在创建设备时添加D3D11_CREATE_DEVICE_DEBUG 标志。如果框架中有问题,您会在输出日志中找到有关原因的详细线索。

    另外,如果您不使用模板,请不要创建模板缓冲区。现代 GPU 无论如何都不会将信息存储在深度缓冲区中,D32 格式不会白白浪费 8 位精度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 2016-09-08
      • 1970-01-01
      相关资源
      最近更新 更多