В DirectX 11 каждая сетка рисуется в буфере глубины как 0, в результате чего тестирование глубины фактически не выполняеC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 В DirectX 11 каждая сетка рисуется в буфере глубины как 0, в результате чего тестирование глубины фактически не выполняе

Сообщение Anonymous »

Насколько мне известно, тестирование глубины настроено правильно, однако объекты просто отрисовываются от начала до конца. Я заглянул в графический отладчик и обнаружил, что при рисовании сетки буфер глубины устанавливается в 0 независимо от расстояния.

Код: Выделить всё

    D3D11_TEXTURE2D_DESC depthBufferDesc;
d3d11FrameBuffer->GetDesc(&depthBufferDesc);

d3d11FrameBuffer->Release();

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

ID3D11Texture2D* depthBuffer;
HRESULT res = d3d11Device->CreateTexture2D(&depthBufferDesc, nullptr, &depthBuffer);

D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
ZeroMemory(&depthStencilViewDesc, sizeof(depthStencilViewDesc));
depthStencilViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
depthStencilViewDesc.Texture2D.MipSlice = 0;

res = d3d11Device->CreateDepthStencilView(depthBuffer, nullptr, depthBufferView);

Код: Выделить всё

    ID3D11DepthStencilState* depthStencilState;
{
D3D11_DEPTH_STENCIL_DESC depthStencilDesc = {};
depthStencilDesc.DepthEnable = true;
depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS;
depthStencilDesc.StencilEnable = false;
depthStencilDesc.StencilReadMask = 0xFF;
depthStencilDesc.StencilWriteMask = 0xFF;
depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;

d3d11Device->CreateDepthStencilState(&depthStencilDesc, &depthStencilState);
}

Код: Выделить всё

        d3d11DeviceContext->RSSetState(rasterizerState);
d3d11DeviceContext->OMSetDepthStencilState(depthStencilState, 1);

d3d11DeviceContext->OMSetRenderTargets(1, &d3d11FrameBufferView, depthBufferView);

Код: Выделить всё

    ID3D11RasterizerState* rasterizerState;
{
D3D11_RASTERIZER_DESC rasterizerDesc = {};
rasterizerDesc.FillMode = D3D11_FILL_SOLID;
rasterizerDesc.CullMode = D3D11_CULL_BACK;
rasterizerDesc.FrontCounterClockwise = true;
rasterizerDesc.DepthBiasClamp = 0;
rasterizerDesc.DepthClipEnable = false;
rasterizerDesc.AntialiasedLineEnable = false;
rasterizerDesc.MultisampleEnable = false;
rasterizerDesc.ScissorEnable = false;
rasterizerDesc.SlopeScaledDepthBias = 0.0f;
rasterizerDesc.DepthBias = 0;

d3d11Device->CreateRasterizerState(&rasterizerDesc, &rasterizerState);
}

Код: Выделить всё

        D3D11_VIEWPORT viewport;
viewport.MinDepth = 0;
viewport.MaxDepth = 1;
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.Width = 1920;
viewport.Height = 1080;
d3d11DeviceContext->RSSetViewports(1, &viewport);
Вершинный шейдер

Код: Выделить всё

PixelInputType vs_main(VertexInputType input)
{
PixelInputType output;

float4 worldPosition = mul(input.position, worldMatrix);
float4 viewPosition = mul(worldPosition, viewMatrix);
output.position = mul(viewPosition, projectionMatrix);

output.tex = input.tex;
output.normal = normalize(input.normal);

return output;
}
Я пробовал менять различные параметры и перемещать расположение части кода, но это не сработало. Я не смог найти другого вопроса, который, казалось бы, работал бы для этого.
У меня отключен клип глубины в растеризаторе, так как, когда я его включаю, ничего не отображается, хотя, насколько я знаю, это не должно влиять на это.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ectively-n
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»