Мозаика рельефа и буфер глубины

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

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

РЕДАКТИРОВАТЬ:

Добавив еще пару изображений, возможно, они немного лучше покажут проблему:

imgimg


person Eugene    schedule 15.12.2013    source источник


Ответы (1)


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

person Eugene    schedule 16.12.2013