地形镶嵌和深度缓冲

时间:2013-12-15 22:12:27

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

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

这是我使用VS图形调试抓取的深度缓冲区的图像。不确定使用调试器显示这个的最佳方法,所以我抓住了红色通道和绿色通道的图像 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;

编辑:

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

img img

1 个答案:

答案 0 :(得分:0)

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