c++ - 地形 segmentation 和深度缓冲区

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

我正在做一些地形渲染,但遇到了一些麻烦。在这个时间点,我只是镶嵌顶点补丁,然后用高度图替换它们。我目前的问题是渲染看起来很时髦。我已经调试了一段时间,看起来这是深度缓冲区的问题。除此之外,我对正在发生的事情真的没有任何想法。

这是我使用 VS 图形调试抓取的深度缓冲区的图像。不确定使用调试器显示此内容的最佳方式,所以我抓取了红色 channel 和绿色 channel 的图像 1 1.5

这是后台缓冲区 2

据我了解,较近的像素应该比较远的像素颜色更深。正如您在比较第二张和第三张图片时看到的那样,情况似乎恰恰相反。我是误会了什么还是发生了什么奇怪的事情。

任何想法或指向一个方向将不胜感激,因为我没有想法。

我将针对可能出现的问题发布我是如何设置深度缓冲区的:

下面是我如何设置深度模板状态和光栅状态:

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

dsdesc.DepthEnable = true;
dsdesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
dsdesc.DepthFunc = D3D11_COMPARISON_LESS;
dsdesc.StencilEnable = true;
dsdesc.StencilReadMask = 0xFF;
dsdesc.StencilWriteMask = 0xFF;
dsdesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
dsdesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
dsdesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
dsdesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
dsdesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
dsdesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
dsdesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
dsdesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;

HR(_device->CreateDepthStencilState(&dsdesc, &_depthStencilState));

D3D11_RASTERIZER_DESC rd;
rd.AntialiasedLineEnable = false;
rd.CullMode = D3D11_CULL_BACK;
rd.DepthClipEnable = true;
rd.DepthBias = 0;
rd.DepthBiasClamp = 0.0f;
rd.FillMode = D3D11_FILL_SOLID; 
rd.FrontCounterClockwise = false;
rd.MultisampleEnable = false;
rd.ScissorEnable = false;
rd.SlopeScaledDepthBias = 0.0f;

然后我确实在使用它们

_context->RSSetState(_rasterStateWireframe);
_context->OMSetDepthStencilState(_depthStencilState, 1);  

这是我设置深度缓冲区的方式:

depthBufferDesc.Width = clientWidth;
depthBufferDesc.Height = clientHeight;
depthBufferDesc.MipLevels = 1;
depthBufferDesc.ArraySize = 1;
depthBufferDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depthBufferDesc.SampleDesc.Count = 1;
depthBufferDesc.SampleDesc.Quality = 0;
depthBufferDesc.Usage = D3D11_USAGE_DEFAULT;
depthBufferDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
depthBufferDesc.CPUAccessFlags = 0;
depthBufferDesc.MiscFlags = 0;

编辑:

添加更 multimap 片,可能会更好地显示问题:

img img

最佳答案

K 解决了这个问题。在创建透视投影时,我翻转了近平面和远平面。

关于c++ - 地形 segmentation 和深度缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20600510/

相关文章:

c# - C++ 非托管包装器在 Web 项目/iis 中不起作用

c++ - 在 DirectX 11 中更改分辨率

windows - DXGI 翻转模型锁定垂直同步

c++ - 使用 C++ 的 Directx11 渲染不工作

c++ - 为什么对高斯进行 FFT 时会出现负数?

c++ - 手动设置重载函数的优先级

c++ - 无法在matlab中的UDP客户端和linux中的服务器之间发送数据

graphics - 如何实现高速动画?

graphics - directx 中多种复杂对象的典型渲染策略?

c++ - D3D11_BUFFER_SRV - 如何使用它?