DirectX 11:启用深度缓冲区视图将隐藏所有几何图形

问题描述 投票:0回答:1

我正在添加对dx11的支持,但遇到了一些问题。在没有深度缓冲区视图的情况下,它可以很好地呈现,但是当我附加它时,我的三角形被隐藏了,并且我只能看到一个空白屏幕。在调试器中,三角形的深度为0.5。它不应该被淘汰。但是它在管道中可见。视口的最小/最大深度为0/1,附加并清除了深度。我不知道为什么我只有一个空白的空白屏幕。

enter image description here

device_->CreateRenderTargetView(pBackBuffer, NULL, &backbuffer_);
pBackBuffer->Release();

unsigned int width, height;
window_->getWindowSize(width, height);

D3D11_TEXTURE2D_DESC depth_stencil_desc;
depth_stencil_desc.Width = width;
depth_stencil_desc.Height = height;
depth_stencil_desc.MipLevels = 1;
depth_stencil_desc.ArraySize = 1;
depth_stencil_desc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depth_stencil_desc.SampleDesc.Count = 1;
depth_stencil_desc.SampleDesc.Quality = 0;
depth_stencil_desc.Usage = D3D11_USAGE_DEFAULT;
depth_stencil_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
depth_stencil_desc.CPUAccessFlags = 0;
depth_stencil_desc.MiscFlags = 0;

//Create the Depth/Stencil View
if (device_->CreateTexture2D(&depth_stencil_desc, NULL, &depth_stencil_buffer_) < 0)
    throw std::runtime_error("DirectX: Could not CreateTexture2D!");

if (device_->CreateDepthStencilView(depth_stencil_buffer_, NULL, &depth_stencil_view_) < 0)
    throw std::runtime_error("DirectX: Could not CreateDepthStencilView!");

// set the render target as the back buffer
device_context_->OMSetRenderTargets(1, &backbuffer_, depth_stencil_view_);

D3D11_VIEWPORT viewport;
ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));

viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.Width = 800;
viewport.Height = 600;
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;

device_context_->RSSetViewports(1, &viewport);

// Loop {

    // Bind shader

    float col[4] = { 0.0f, 0.2f, 0.4f, 1.0f };
    device_context_->ClearRenderTargetView(backbuffer_, col);
    device_context_->ClearDepthStencilView(depth_stencil_view_, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);

    // Bind vertex buffer, constant buffer, texture
    device_context_->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    device_context_->Draw(count, base);
    swap_chain_->Present(0, 0);

// End Loop
graphics 3d directx direct3d
1个回答
0
投票

我已经提供了可能会有所帮助的“深度模板”创建代码。但是看起来它们可能是您可以尝试的一些参数差异。仅当您需要读回深度模板时才需要着色器资源绑定标志。此代码在C#和Sharpdx中,仅供参考。

            D3D11.Texture2DDescription desc = new D3D11.Texture2DDescription()
            {
                Format = DXGI.Format.R32_Typeless,
                ArraySize = 1,
                MipLevels = 0,
                Width = _textureWidth,
                Height = _textureHeight,
                Usage = D3D11.ResourceUsage.Default,
                SampleDescription = new DXGI.SampleDescription(1, 0),
                BindFlags = D3D11.BindFlags.DepthStencil | D3D11.BindFlags.ShaderResource,
                CpuAccessFlags = D3D11.CpuAccessFlags.None,
                OptionFlags = D3D11.ResourceOptionFlags.None
            };
            D3D11.Texture2D depthBuffer = new D3D11.Texture2D(d3dDevice_, desc);

            // Depth Buffer

            D3D11.DepthStencilViewDescription stencilBufferViewDesc = new D3D11.DepthStencilViewDescription()
            {
                Dimension = D3D11.DepthStencilViewDimension.Texture2D,
                Format = DXGI.Format.D32_Float,
                Flags = D3D11.DepthStencilViewFlags.None,

                Texture2D = new D3D11.DepthStencilViewDescription.Texture2DResource() { MipSlice = 0 },
            };

            _depthStencilView = new D3D11.DepthStencilView(d3dDevice_, depthBuffer, stencilBufferViewDesc)
            {
                DebugName = "Shadow Map Depth Buffer Stencil View"
            };
© www.soinside.com 2019 - 2024. All rights reserved.