Я делаю рендеринг на местности и столкнулся с некоторыми неприятностями. На данный момент я просто тестирую патчи вершин, а затем заменяю их картой высот. Моя текущая проблема заключается в том, что рендеринг выглядит довольно прикольным. Я отлаживал это некоторое время, и похоже, что это проблема с буфером глубины. После этого у меня нет никаких идей о том, что происходит.
Вот изображение буфера глубины, который я взял, используя отладку графики VS. Не был уверен, что лучший способ показать это с помощью отладчика, поэтому я взял изображение красного канала и зеленого канала
Вот бэкбуфер
Насколько я понимаю, более близкие пиксели должны быть окрашены темнее, чем другие пиксели. Как вы можете видеть при сравнении второго и третьего изображений, кажется, что происходит обратное. Я неправильно понимаю что-то или происходит что-то странное.
Любые мысли или указания в каком-либо направлении будут очень благодарны, так как у меня нет идей.
Я опубликую, как я настраиваю свой буфер глубины для возможных вопросов:
Вот как я настраиваю состояние трафарета глубины и состояние растра:
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;
РЕДАКТИРОВАТЬ:
Добавив еще пару картинок, возможно, покажу проблему чуть лучше:
К решил проблему. При создании перспективной проекции я перевернул ближнюю и дальнюю плоскости.
Других решений пока нет …