Graphics: Add a way to set which passes are enabled in a frame pipeline

This will be replaced soon with a better system
This commit is contained in:
SirLynix
2023-10-08 23:44:24 +02:00
parent 50c90fd725
commit b09b4d2419
9 changed files with 71 additions and 13 deletions

View File

@@ -237,15 +237,13 @@ namespace Nz
return skeletonInstanceIndex;
}
std::size_t ForwardFramePipeline::RegisterViewer(AbstractViewer* viewerInstance, Int32 renderOrder)
std::size_t ForwardFramePipeline::RegisterViewer(AbstractViewer* viewerInstance, Int32 renderOrder, FramePipelineExtraPassFlags passFlags)
{
std::size_t depthPassIndex = Graphics::Instance()->GetMaterialPassRegistry().GetPassIndex("DepthPass");
std::size_t viewerIndex;
auto& viewerData = *m_viewerPool.Allocate(viewerIndex);
viewerData.renderOrder = renderOrder;
viewerData.debugDrawPass = std::make_unique<DebugDrawPipelinePass>(*this, viewerInstance);
viewerData.depthPrepass = std::make_unique<DepthPipelinePass>(*this, m_elementRegistry, viewerInstance, depthPassIndex, "Depth pre-pass");
viewerData.forwardPass = std::make_unique<ForwardPipelinePass>(*this, m_elementRegistry, viewerInstance);
viewerData.viewer = viewerInstance;
viewerData.onTransferRequired.Connect(viewerInstance->GetViewerInstance().OnTransferRequired, [this](TransferInterface* transferInterface)
@@ -253,6 +251,12 @@ namespace Nz
m_transferSet.insert(transferInterface);
});
if (passFlags.Test(FramePipelineExtraPass::DebugDraw))
viewerData.debugDrawPass = std::make_unique<DebugDrawPipelinePass>(*this, viewerInstance);
if (passFlags.Test(FramePipelineExtraPass::DepthPrepass))
viewerData.depthPrepass = std::make_unique<DepthPipelinePass>(*this, m_elementRegistry, viewerInstance, depthPassIndex, "Depth pre-pass");
m_transferSet.insert(&viewerInstance->GetViewerInstance());
m_rebuildFrameGraph = true;
@@ -394,7 +398,8 @@ namespace Nz
viewerData.forwardPass->Prepare(renderFrame, frustum, visibleRenderables, m_visibleLights, visibilityHash);
viewerData.debugDrawPass->Prepare(renderFrame);
if (viewerData.debugDrawPass)
viewerData.debugDrawPass->Prepare(renderFrame);
}
if (frameGraphInvalidated)
@@ -410,7 +415,7 @@ namespace Nz
{
0,
ShaderBinding::SampledTextureBinding {
m_bakedFrameGraph.GetAttachmentTexture(viewerData.debugColorAttachment).get(),
m_bakedFrameGraph.GetAttachmentTexture(viewerData.finalColorAttachment).get(),
sampler.get()
}
}
@@ -606,7 +611,6 @@ namespace Nz
PixelFormat::RGBA8
});
viewerData.debugColorAttachment = frameGraph.AddAttachmentProxy("Debug draw output", viewerData.forwardColorAttachment);
viewerData.depthStencilAttachment = frameGraph.AddAttachment({
"Depth-stencil buffer",
@@ -623,7 +627,14 @@ namespace Nz
lightData->shadowData->RegisterPassInputs(forwardPass);
}
viewerData.debugDrawPass->RegisterToFrameGraph(frameGraph, viewerData.forwardColorAttachment, viewerData.debugColorAttachment);
if (viewerData.debugDrawPass)
{
viewerData.debugColorAttachment = frameGraph.AddAttachmentProxy("Debug draw output", viewerData.forwardColorAttachment);
viewerData.debugDrawPass->RegisterToFrameGraph(frameGraph, viewerData.forwardColorAttachment, viewerData.debugColorAttachment);
viewerData.finalColorAttachment = viewerData.debugColorAttachment;
}
else
viewerData.finalColorAttachment = viewerData.forwardColorAttachment;
}
using ViewerPair = std::pair<const RenderTarget*, const ViewerData*>;
@@ -661,7 +672,7 @@ namespace Nz
});
for (const ViewerData* viewerData : targetViewers)
mergePass.AddInput(viewerData->debugColorAttachment);
mergePass.AddInput(viewerData->finalColorAttachment);
mergePass.AddOutput(renderTargetData.finalAttachment);
mergePass.SetClearColor(0, Color::Black());

View File

@@ -330,7 +330,7 @@ namespace Nz
CameraEntity* cameraEntity = m_cameraEntityPool.Allocate(poolIndex);
cameraEntity->poolIndex = poolIndex;
cameraEntity->entity = entity;
cameraEntity->viewerIndex = m_pipeline->RegisterViewer(&entityCamera, entityCamera.GetRenderOrder());
cameraEntity->viewerIndex = m_pipeline->RegisterViewer(&entityCamera, entityCamera.GetRenderOrder(), entityCamera.GetFramePipelineExtraPassFlags());
cameraEntity->onNodeInvalidation.Connect(entityNode.OnNodeInvalidation, [this, cameraEntity](const Node* /*node*/)
{
m_invalidatedCameraNode.insert(cameraEntity);