gpt4 book ai didi

c++ - DirectX - 启用深度缓冲后没有渲染

转载 作者:行者123 更新时间:2023-11-28 04:15:11 24 4
gpt4 key购买 nike

我试图在 DirectX 11.0 的渲染器中实现深度缓冲,但我遇到了特殊问题。我是 DirectX 的新手,所以这可能是个愚蠢的问题,但我无法自己解决。我查看了很多关于这个主题的教程,每个教程都或多或少地展示了如何做到这一点。

我在现场有两个三角形。当我启用深度时,一切都消失了,我只有蓝屏(背景颜色)。

为了启用深度缓冲,我首先创建了“深度模板纹理描述”,并使用“深度模板 View ”创建了“深度模板缓冲区”。然后作为函数 OMSetRenderTargets 的最后一个参数,我设置了 DepthStencilView。之后我创建了“深度模板状态”。

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)深度​​:

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

然后我转到我的渲染函数并添加清除深度模板和设置状态,如下所示:

...

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

...

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

而且...它不起作用。如果将 OMSetRenderTargets 的最后一个参数从 DepthStencilView.Get() 更改为 nullptr,它会起作用。所以看起来我在深度模板上做错了,但我不确定是什么。我为此 Renderer.cpp 创建了要点 HERE .请帮我解决这个问题,因为我陷入了困境,不知道该怎么做。

最佳答案

创建深度/模板 View 时,确保渲染目标 View 和深度模板 View 的样本和计数的 MSAA 设置相同。

为 MSAA 目标创建 DSV 时可能需要其他信息。这是我的 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);
}

关于c++ - DirectX - 启用深度缓冲后没有渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56826131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com