Direct3D визуализация сложности dpeth - PullRequest
0 голосов
/ 05 октября 2019

Я новичок в Direct3D: D

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

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

Пожалуйста, посмотрите мой код и скажите, что я сделал не так.

сначала я сделал 2 depthstencilstates. DepthComplexityWriteDSS используется для записи сложности глубины в буфере трафарета, а DepthComplexityCheckDDS - для сложности глубины визуализации.

//
// DepthComplexityWriteDSS
//
D3D11_DEPTH_STENCIL_DESC depthComplexityWriteDesc;
ZeroMemory(&depthComplexityWriteDesc, sizeof(D3D11_DEPTH_STENCIL_DESC));
depthComplexityWriteDesc.DepthEnable = true;
depthComplexityWriteDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
depthComplexityWriteDesc.DepthFunc = D3D11_COMPARISON_LESS;

depthComplexityWriteDesc.StencilEnable = true;
depthComplexityWriteDesc.StencilReadMask = 0xff;
depthComplexityWriteDesc.StencilWriteMask = 0xff;
//front
depthComplexityWriteDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthComplexityWriteDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
depthComplexityWriteDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_INCR;
depthComplexityWriteDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
//back
depthComplexityWriteDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthComplexityWriteDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
depthComplexityWriteDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_INCR;
depthComplexityWriteDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;

device->CreateDepthStencilState(&depthComplexityWriteDesc, &DepthComplexityWriteDSS);

//
// DepthComplexityCheckDDS
//
D3D11_DEPTH_STENCIL_DESC depthComplexityCheckDesc;
ZeroMemory(&depthComplexityWriteDesc, sizeof(D3D11_DEPTH_STENCIL_DESC));
depthComplexityCheckDesc.DepthEnable = true;
depthComplexityCheckDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
depthComplexityCheckDesc.DepthFunc = D3D11_COMPARISON_LESS;

depthComplexityCheckDesc.StencilEnable = true;
depthComplexityCheckDesc.StencilReadMask = 0xff;
depthComplexityCheckDesc.StencilWriteMask = 0xff;
//front
depthComplexityCheckDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthComplexityCheckDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
depthComplexityCheckDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthComplexityCheckDesc.FrontFace.StencilFunc = D3D11_COMPARISON_EQUAL;
//back
depthComplexityCheckDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthComplexityCheckDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
depthComplexityCheckDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthComplexityCheckDesc.BackFace.StencilFunc = D3D11_COMPARISON_EQUAL;

device->CreateDepthStencilState(&depthComplexityCheckDesc, &DepthComplexityCheckDSS);

Далее я устанавливаю depthstencilstate с помощью DepthComplexityWriteDSS, а затем рисую холм, воду, цилиндр. (Я думаю, что это не важный процесс)

Наконец, в положении камеры я рисовал коробки, которые раскрашивались для каждой глубины сложности.

//draw boxes
activeTech = Effects::BasicFX->Light0Tech;
activeTech->GetDesc(&techDesc);
for (UINT p = 0; p < techDesc.Passes; ++p)
{
    md3dImmediateContext->IASetVertexBuffers(0, 1, &mBoxVB, &stride, &offset);
    md3dImmediateContext->IASetIndexBuffer(mBoxIB, DXGI_FORMAT_R32_UINT, 0);
    md3dImmediateContext->RSSetState(RenderStates::NoCullRS);

    //first box
    XMMATRIX world = XMMatrixTranslation(mEyePosW.x, mEyePosW.y, mEyePosW.z);
    XMMATRIX worldInvTranspose = MathHelper::InverseTranspose(world);
    XMMATRIX worldViewProj = world * view * proj;
    mBoxMat.Diffuse = XMFLOAT4(reinterpret_cast<const float*>(&Colors::Blue));
    Effects::BasicFX->SetWorld(world);
    Effects::BasicFX->SetWorldInvTranspose(worldInvTranspose);
    Effects::BasicFX->SetWorldViewProj(worldViewProj);
    Effects::BasicFX->SetMaterial(mBoxMat);

    md3dImmediateContext->OMSetDepthStencilState(RenderStates::DepthComplexityCheckDSS, 1);
    activeTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);
    md3dImmediateContext->DrawIndexed(mBoxIndexCount, 0, 0);

    //second box
    mBoxMat.Diffuse = XMFLOAT4(reinterpret_cast<const float*>(&Colors::Green));
    Effects::BasicFX->SetMaterial(mBoxMat);

    md3dImmediateContext->OMSetDepthStencilState(RenderStates::DepthComplexityCheckDSS, 2);
    activeTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);
    md3dImmediateContext->DrawIndexed(mBoxIndexCount, 0, 0);

    //third box
    mBoxMat.Diffuse = XMFLOAT4(reinterpret_cast<const float*>(&Colors::Cyan));
    Effects::BasicFX->SetMaterial(mBoxMat);

    md3dImmediateContext->OMSetDepthStencilState(RenderStates::DepthComplexityCheckDSS, 3);
    activeTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);
    md3dImmediateContext->DrawIndexed(mBoxIndexCount, 0, 0);

    //fourth box
    mBoxMat.Diffuse = XMFLOAT4(reinterpret_cast<const float*>(&Colors::Magenta));
    Effects::BasicFX->SetMaterial(mBoxMat);

    md3dImmediateContext->OMSetDepthStencilState(RenderStates::DepthComplexityCheckDSS, 4);
    activeTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);
    md3dImmediateContext->DrawIndexed(mBoxIndexCount, 0, 0);

    //fifth box
    mBoxMat.Diffuse = XMFLOAT4(reinterpret_cast<const float*>(&Colors::LightSteelBlue));
    Effects::BasicFX->SetMaterial(mBoxMat);

    md3dImmediateContext->OMSetDepthStencilState(RenderStates::DepthComplexityCheckDSS, 5);
    activeTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);
    md3dImmediateContext->DrawIndexed(mBoxIndexCount, 0, 0);

    md3dImmediateContext->RSSetState(nullptr);
    md3dImmediateContext->OMSetBlendState(0, nullptr, 0xffffffff);
    md3dImmediateContext->OMSetDepthStencilState(nullptr, 0);

}

Спасибо за чтение этого поста.

...