DirectX - ничего не рендерится после включения буфера глубины - PullRequest
0 голосов
/ 30 июня 2019

Я пытался внедрить буфер глубины в мой рендерер в DirectX 11.0, но столкнулся со специфической проблемой.Я новичок в DirectX, так что это может быть глупый вопрос, но я не могу это исправить самостоятельно.Я проверил много уроков по этой теме, и каждый показывает, как сделать это более или менее одинаково.

У меня есть два треугольника на сцене.Когда я включаю глубину, все размышляет, и у меня появляется только синий экран (цвет фона).

Чтобы включить буфер глубины, я сначала создал «Описание текстуры шаблона глубины» и создал «Буфер шаблона глубины» с «Представлением шаблона глубины».,Затем в качестве последнего параметра функции OMSetRenderTargets я установил DepthStencilView.После этого я создал «Depth Stencil State».

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

hr = Device->CreateTexture2D(&depthStencilTextureDesc, nullptr, DepthStencilBuffer.GetAddressOf());
if (FAILED(hr))
{
    Logger::Error("Error creating depth stencil buffer!");
    return false;
}

hr = Device->CreateDepthStencilView(DepthStencilBuffer.Get(), nullptr, DepthStencilView.GetAddressOf());
if (FAILED(hr))
{
    Logger::Error("Error creating depth stencil view!");
    return false;
}

Logger::Debug("Successfully created depth stencil buffer and view.");

DeviceContext->OMSetRenderTargets(1, RenderTargetView.GetAddressOf(), DepthStencilView.Get());
Logger::Debug("Binding render target output merge successfully.");

D3D11_DEPTH_STENCIL_DESC depthStencilDesc;
ZeroMemory(&depthStencilDesc, sizeof(D3D11_DEPTH_STENCIL_DESC));

depthStencilDesc.DepthEnable = true;
depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL;

hr = Device->CreateDepthStencilState(&depthStencilDesc, DepthStencilState.GetAddressOf());
if (FAILED(hr))
{
    Logger::Error("Error creating depth stencil state!");
    return false;
}

Затем я установил глубину области просмотра с помощью этого кода:

viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;

Затем я перешел к своей функции Render и добавил очищающий трафарет глубины иустановка состояния так:

...

DeviceContext->ClearDepthStencilView(DepthStencilView.Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);

...

DeviceContext->OMSetDepthStencilState(DepthStencilState.Get(), 0);

И ... Это не работает.Если изменить последний параметр OMSetRenderTargets с DepthStencilView.Get () на nullptr, это сработает.Так что кажется, что я что-то не так с трафаретом глубины, но я не уверен, что.Я создал суть для этого Renderer.cpp ЗДЕСЬ .Пожалуйста, помогите мне решить эту проблему, потому что я застрял в этом, и я не знаю, что делать.

Ответы [ 2 ]

1 голос
/ 01 июля 2019

При создании просмотра глубины / трафарета убедитесь, что параметры MSAA для выборки и подсчета одинаковы как для представления цели рендеринга, так и для просмотра глубины трафарета.

DSV может потребоваться дополнительная информация при создании для цели MSAA. Вот пример того, как создается мой DSV (обратите внимание, что я не использую буфер трафарета, а вместо этого выбрал более высокую точность в моем буфере глубины):

//Describe our Depth/Stencil Buffer
D3D11_TEXTURE2D_DESC depthStencilDesc;

depthStencilDesc.Width = activeDisplayMode.Width;
depthStencilDesc.Height = activeDisplayMode.Height;
depthStencilDesc.MipLevels = 1;
depthStencilDesc.ArraySize = 1;
depthStencilDesc.Format = DXGI_FORMAT_R32_TYPELESS;
depthStencilDesc.SampleDesc.Count = sampleLevel;
depthStencilDesc.SampleDesc.Quality = qualityLevel;
depthStencilDesc.Usage = D3D11_USAGE_DEFAULT;
depthStencilDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
depthStencilDesc.CPUAccessFlags = 0;
depthStencilDesc.MiscFlags = 0;

if (MSAAEnabled == true)
{
    //Need a DSVDesc to let it know to use MSAA
    D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
    ZeroMemory(&depthStencilViewDesc, sizeof(D3D11_DEPTH_STENCIL_VIEW_DESC));
    depthStencilViewDesc.Format = DXGI_FORMAT_D32_FLOAT;
    depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS;
    depthStencilViewDesc.Texture2D.MipSlice = 0;

    dev->CreateTexture2D(&depthStencilDesc, NULL, &depthStencilBuffer);
    dev->CreateDepthStencilView(depthStencilBuffer, &depthStencilViewDesc, &depthStencilView);
}
else
{
    //Don't need a DSVDesc
    dev->CreateTexture2D(&depthStencilDesc, NULL, &depthStencilBuffer);
    dev->CreateDepthStencilView(depthStencilBuffer, NULL, &depthStencilView);
}
0 голосов
/ 30 июня 2019

Я подведу итог тому, что нашел с помощью GaleRazorwind.Я исправил свою проблему, установив значения мультисэмплирования deepStencilTextureDesc равными значениям из BufferDesc.

...