Я новичок в 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);
}
Спасибо за чтение этого поста.