DeferredShading: Implement stencil optimization

This commit is contained in:
Jérôme Leclercq 2021-05-28 23:00:16 +02:00
parent c2b61b6732
commit 336e70f72e
1 changed files with 38 additions and 4 deletions

View File

@ -343,14 +343,42 @@ int main()
0, 0,
meshPrimitiveParams.vertexDeclaration meshPrimitiveParams.vertexDeclaration
}); });
lightingPipelineInfo.depthBuffer = false;
lightingPipelineInfo.faceCulling = true; lightingPipelineInfo.faceCulling = true;
lightingPipelineInfo.cullingSide = Nz::FaceSide::Front; lightingPipelineInfo.cullingSide = Nz::FaceSide::Front;
lightingPipelineInfo.stencilTest = true;
lightingPipelineInfo.stencilBack.compare = Nz::RendererComparison::NotEqual;
lightingPipelineInfo.stencilBack.fail = Nz::StencilOperation::Zero;
lightingPipelineInfo.stencilBack.depthFail = Nz::StencilOperation::Zero;
lightingPipelineInfo.stencilBack.pass = Nz::StencilOperation::Zero;
lightingPipelineInfo.shaderModules.push_back(device->InstantiateShaderModule(Nz::ShaderStageType::Fragment | Nz::ShaderStageType::Vertex, Nz::ShaderLanguage::NazaraShader, resourceDir / "lighting.nzsl", {})); lightingPipelineInfo.shaderModules.push_back(device->InstantiateShaderModule(Nz::ShaderStageType::Fragment | Nz::ShaderStageType::Vertex, Nz::ShaderLanguage::NazaraShader, resourceDir / "lighting.nzsl", {}));
std::shared_ptr<Nz::RenderPipeline> lightingPipeline = device->InstantiateRenderPipeline(lightingPipelineInfo); std::shared_ptr<Nz::RenderPipeline> lightingPipeline = device->InstantiateRenderPipeline(lightingPipelineInfo);
Nz::RenderPipelineInfo stencilPipelineInfo;
stencilPipelineInfo.primitiveMode = Nz::PrimitiveMode::TriangleList;
stencilPipelineInfo.pipelineLayout = device->InstantiateRenderPipelineLayout(lightingPipelineLayoutInfo);
stencilPipelineInfo.vertexBuffers.push_back({
0,
meshPrimitiveParams.vertexDeclaration
});
stencilPipelineInfo.colorWrite = false;
stencilPipelineInfo.depthBuffer = true;
stencilPipelineInfo.depthWrite = false;
stencilPipelineInfo.faceCulling = false;
stencilPipelineInfo.stencilTest = true;
stencilPipelineInfo.stencilFront.compare = Nz::RendererComparison::Always;
stencilPipelineInfo.stencilFront.depthFail = Nz::StencilOperation::Invert;
stencilPipelineInfo.stencilBack.compare = Nz::RendererComparison::Always;
stencilPipelineInfo.stencilBack.depthFail = Nz::StencilOperation::Invert;
stencilPipelineInfo.shaderModules.push_back(device->InstantiateShaderModule(Nz::ShaderStageType::Fragment | Nz::ShaderStageType::Vertex, Nz::ShaderLanguage::NazaraShader, resourceDir / "lighting.nzsl", {}));
std::shared_ptr<Nz::RenderPipeline> stencilPipeline = device->InstantiateRenderPipeline(stencilPipelineInfo);
std::vector<std::shared_ptr<Nz::ShaderBinding>> lightingShaderBindings; std::vector<std::shared_ptr<Nz::ShaderBinding>> lightingShaderBindings;
std::array<Nz::VertexStruct_XYZ_UV, 3> vertexData = { std::array<Nz::VertexStruct_XYZ_UV, 3> vertexData = {
@ -494,7 +522,6 @@ int main()
builder.SetScissor(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) }); builder.SetScissor(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) });
builder.SetViewport(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) }); builder.SetViewport(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) });
builder.BindPipeline(*lightingPipeline);
//builder.BindVertexBuffer(0, vertexBuffer.get()); //builder.BindVertexBuffer(0, vertexBuffer.get());
builder.BindIndexBuffer(coneMeshGfx->GetIndexBuffer(0).get()); builder.BindIndexBuffer(coneMeshGfx->GetIndexBuffer(0).get());
builder.BindVertexBuffer(0, coneMeshGfx->GetVertexBuffer(0).get()); builder.BindVertexBuffer(0, coneMeshGfx->GetVertexBuffer(0).get());
@ -502,6 +529,11 @@ int main()
for (std::size_t i = 0; i < spotLights.size(); ++i) for (std::size_t i = 0; i < spotLights.size(); ++i)
{ {
builder.BindShaderBinding(*lightingShaderBindings[i]); builder.BindShaderBinding(*lightingShaderBindings[i]);
builder.BindPipeline(*stencilPipeline);
builder.DrawIndexed(coneMeshGfx->GetIndexCount(0));
builder.BindPipeline(*lightingPipeline);
builder.DrawIndexed(coneMeshGfx->GetIndexCount(0)); builder.DrawIndexed(coneMeshGfx->GetIndexCount(0));
} }
}); });
@ -510,6 +542,8 @@ int main()
lightingPass.AddInput(normalTexture); lightingPass.AddInput(normalTexture);
lightingPass.AddInput(positionTexture); lightingPass.AddInput(positionTexture);
lightingPass.SetClearColor(lightingPass.AddOutput(backbuffer), Nz::Color::Black); lightingPass.SetClearColor(lightingPass.AddOutput(backbuffer), Nz::Color::Black);
lightingPass.SetDepthStencilInput(depthBuffer);
lightingPass.SetDepthStencilOutput(depthBuffer);
//lightingPass.SetDepthStencilInput(depthBuffer); //lightingPass.SetDepthStencilInput(depthBuffer);
graph.SetBackbufferOutput(backbuffer); graph.SetBackbufferOutput(backbuffer);
@ -608,9 +642,9 @@ int main()
RebuildCommandBuffer(); RebuildCommandBuffer();
Nz::Vector3f viewerPos = Nz::Vector3f::Zero(); Nz::Vector3f viewerPos = Nz::Vector3f::Backward() * 10.f + Nz::Vector3f::Up() * -3.f;
Nz::EulerAnglesf camAngles(0.f, 0.f, 0.f); Nz::EulerAnglesf camAngles(30.f, 0.f, 0.f);
Nz::Quaternionf camQuat(camAngles); Nz::Quaternionf camQuat(camAngles);
window.EnableEventPolling(true); window.EnableEventPolling(true);