Graphics: Add FramePipelinePassFlag to fix shadows

This commit is contained in:
SirLynix
2023-11-03 11:24:41 +01:00
committed by Jérôme Leclercq
parent 8fb6ea728d
commit ef0a34b7b1
13 changed files with 85 additions and 34 deletions

View File

@@ -55,10 +55,10 @@ namespace Nz
return m_viewport;
}
std::size_t Camera::RegisterPasses(const std::vector<std::unique_ptr<FramePipelinePass>>& passes, FrameGraph& frameGraph) const
std::size_t Camera::RegisterPasses(const std::vector<std::unique_ptr<FramePipelinePass>>& passes, FrameGraph& frameGraph, const FunctionRef<void(std::size_t passIndex, FramePass& framePass, FramePipelinePassFlags flags)>& passCallback) const
{
assert(m_framePipelinePasses);
return m_framePipelinePasses->RegisterPasses(passes, frameGraph);
return m_framePipelinePasses->RegisterPasses(passes, frameGraph, passCallback);
}
void Camera::UpdateTarget(const RenderTarget* renderTarget)

View File

@@ -713,7 +713,20 @@ namespace Nz
lightData->shadowData->RegisterToFrameGraph(frameGraph, viewerData.viewer);
}
viewerData.finalColorAttachment = viewerData.viewer->RegisterPasses(viewerData.passes, frameGraph);
auto framePassCallback = [this, &viewerData, renderMask](std::size_t /*passIndex*/, FramePass& framePass, FramePipelinePassFlags flags)
{
if (flags.Test(FramePipelinePassFlag::LightShadowing))
{
for (std::size_t i : m_shadowCastingLights.IterBits())
{
LightData* lightData = m_lightPool.RetrieveFromIndex(i);
if ((renderMask & lightData->renderMask) != 0)
lightData->shadowData->RegisterPassInputs(framePass, (lightData->shadowData->IsPerViewer()) ? viewerData.viewer : nullptr);
}
}
};
viewerData.finalColorAttachment = viewerData.viewer->RegisterPasses(viewerData.passes, frameGraph, framePassCallback);
}
using ViewerPair = std::pair<const RenderTarget*, const ViewerData*>;

View File

@@ -390,6 +390,8 @@ namespace Nz
m_defaultPipelinePasses->SetPassOutput(forwardPass, 0, forwardColorOutput);
m_defaultPipelinePasses->SetPassDepthStencilOutput(forwardPass, forwardDepthOutput);
m_defaultPipelinePasses->EnablePassFlags(forwardPass, FramePipelinePassFlag::LightShadowing);
// Gamma correction
std::size_t gammaCorrectionOutput = m_defaultPipelinePasses->AddAttachment({
"Gamma-corrected output",

View File

@@ -22,7 +22,7 @@ namespace Nz
return passes;
}
std::size_t PipelinePassList::RegisterPasses(const std::vector<std::unique_ptr<FramePipelinePass>>& passes, FrameGraph& frameGraph) const
std::size_t PipelinePassList::RegisterPasses(const std::vector<std::unique_ptr<FramePipelinePass>>& passes, FrameGraph& frameGraph, const FunctionRef<void(std::size_t passIndex, FramePass& framePass, FramePipelinePassFlags flags)>& passCallback) const
{
NazaraAssert(m_passes.size() == passes.size(), "pass vector size doesn't match passlist size");
@@ -39,17 +39,17 @@ namespace Nz
return attachmentIndices[attachmentIndex];
};
for (std::size_t i = 0; i < passes.size(); ++i)
for (std::size_t passIndex = 0; passIndex < passes.size(); ++passIndex)
{
const Pass& passData = m_passes[i];
const Pass& passData = m_passes[passIndex];
std::array<std::size_t, MaxPassAttachment> inputs;
for (std::size_t j = 0; j < passData.inputs.size(); ++j)
inputs[j] = GetAttachmentIndex(passData.inputs[j]);
for (std::size_t i = 0; i < passData.inputs.size(); ++i)
inputs[i] = GetAttachmentIndex(passData.inputs[i]);
std::array<std::size_t, MaxPassAttachment> outputs;
for (std::size_t j = 0; j < passData.outputs.size(); ++j)
outputs[j] = GetAttachmentIndex(passData.outputs[j]);
for (std::size_t i = 0; i < passData.outputs.size(); ++i)
outputs[i] = GetAttachmentIndex(passData.outputs[i]);
FramePipelinePass::PassInputOuputs passInputOuputs;
passInputOuputs.depthStencilInput = GetAttachmentIndex(passData.depthStencilInput);
@@ -59,7 +59,9 @@ namespace Nz
passInputOuputs.outputAttachments = outputs.data();
passInputOuputs.outputCount = passData.outputs.size();
passes[i]->RegisterToFrameGraph(frameGraph, passInputOuputs);
FramePass& framePass = passes[passIndex]->RegisterToFrameGraph(frameGraph, passInputOuputs);
if (passCallback)
passCallback(passIndex, framePass, passData.flags);
}
return GetAttachmentIndex(m_finalOutputAttachment);