Тесселяция ландшафта и буфер глубины

Я делаю рендеринг на местности и столкнулся с некоторыми неприятностями. На данный момент я просто тестирую патчи вершин, а затем заменяю их картой высот. Моя текущая проблема заключается в том, что рендеринг выглядит довольно прикольным. Я отлаживал это некоторое время, и похоже, что это проблема с буфером глубины. После этого у меня нет никаких идей о том, что происходит.

Вот изображение буфера глубины, который я взял, используя отладку графики 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

2

Решение

К решил проблему. При создании перспективной проекции я перевернул ближнюю и дальнюю плоскости.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]