DirectX 11: включение глубинного буфера скрывает всю геометрию - PullRequest
0 голосов
/ 15 марта 2020

Я добавляю поддержку 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

РЕДАКТИРОВАТЬ: enter image description here

1 Ответ

0 голосов
/ 16 марта 2020

Я включил свой код создания трафарета глубины, который может помочь. Но похоже, что они могут иметь несколько различий в параметрах, которые вы можете попробовать. Флаг привязки ресурса шейдера требуется только в том случае, если вам нужно прочитать трафарет глубины обратно. Этот код указан в 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"
            };
...