Graphics: Add FramePipelinePassFlag to fix shadows
This commit is contained in:
parent
8fb6ea728d
commit
ef0a34b7b1
|
|
@ -45,7 +45,7 @@ namespace Nz
|
||||||
inline float GetZFar() const;
|
inline float GetZFar() const;
|
||||||
inline float GetZNear() const;
|
inline float GetZNear() const;
|
||||||
|
|
||||||
std::size_t RegisterPasses(const std::vector<std::unique_ptr<FramePipelinePass>>& passes, FrameGraph& frameGraph) const override;
|
std::size_t RegisterPasses(const std::vector<std::unique_ptr<FramePipelinePass>>& passes, FrameGraph& frameGraph, const FunctionRef<void(std::size_t passIndex, FramePass& framePass, FramePipelinePassFlags flags)>& passCallback = nullptr) const override;
|
||||||
|
|
||||||
inline void UpdateClearColor(Color color);
|
inline void UpdateClearColor(Color color);
|
||||||
inline void UpdateFOV(DegreeAnglef fov);
|
inline void UpdateFOV(DegreeAnglef fov);
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
#define NAZARA_GRAPHICS_DEBUGDRAWPIPELINEPASS_HPP
|
#define NAZARA_GRAPHICS_DEBUGDRAWPIPELINEPASS_HPP
|
||||||
|
|
||||||
#include <NazaraUtils/Prerequisites.hpp>
|
#include <NazaraUtils/Prerequisites.hpp>
|
||||||
|
#include <Nazara/Core/ParameterList.hpp>
|
||||||
#include <Nazara/Graphics/Config.hpp>
|
#include <Nazara/Graphics/Config.hpp>
|
||||||
#include <Nazara/Graphics/FramePipelinePass.hpp>
|
#include <Nazara/Graphics/FramePipelinePass.hpp>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
@ -18,7 +19,6 @@ namespace Nz
|
||||||
class FrameGraph;
|
class FrameGraph;
|
||||||
class FramePass;
|
class FramePass;
|
||||||
class FramePipeline;
|
class FramePipeline;
|
||||||
class ParameterList;
|
|
||||||
class RenderFrame;
|
class RenderFrame;
|
||||||
|
|
||||||
class NAZARA_GRAPHICS_API DebugDrawPipelinePass : public FramePipelinePass
|
class NAZARA_GRAPHICS_API DebugDrawPipelinePass : public FramePipelinePass
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
#define NAZARA_GRAPHICS_DEPTHPIPELINEPASS_HPP
|
#define NAZARA_GRAPHICS_DEPTHPIPELINEPASS_HPP
|
||||||
|
|
||||||
#include <NazaraUtils/Prerequisites.hpp>
|
#include <NazaraUtils/Prerequisites.hpp>
|
||||||
|
#include <Nazara/Core/ParameterList.hpp>
|
||||||
#include <Nazara/Graphics/Config.hpp>
|
#include <Nazara/Graphics/Config.hpp>
|
||||||
#include <Nazara/Graphics/ElementRenderer.hpp>
|
#include <Nazara/Graphics/ElementRenderer.hpp>
|
||||||
#include <Nazara/Graphics/FramePipelinePass.hpp>
|
#include <Nazara/Graphics/FramePipelinePass.hpp>
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,20 @@ namespace Nz
|
||||||
Volume
|
Volume
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class EngineShaderBinding
|
||||||
|
{
|
||||||
|
InstanceDataUbo,
|
||||||
|
LightDataUbo,
|
||||||
|
OverlayTexture,
|
||||||
|
ShadowmapDirectional,
|
||||||
|
ShadowmapPoint,
|
||||||
|
ShadowmapSpot,
|
||||||
|
SkeletalDataUbo,
|
||||||
|
ViewerDataUbo,
|
||||||
|
|
||||||
|
Max = ViewerDataUbo
|
||||||
|
};
|
||||||
|
|
||||||
enum class FramePipelineNotification
|
enum class FramePipelineNotification
|
||||||
{
|
{
|
||||||
ElementInvalidation,
|
ElementInvalidation,
|
||||||
|
|
@ -57,6 +71,21 @@ namespace Nz
|
||||||
|
|
||||||
using FramePipelineNotificationFlags = Flags<FramePipelineNotification>;
|
using FramePipelineNotificationFlags = Flags<FramePipelineNotification>;
|
||||||
|
|
||||||
|
enum class FramePipelinePassFlag
|
||||||
|
{
|
||||||
|
LightShadowing,
|
||||||
|
|
||||||
|
Max = LightShadowing
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct EnumAsFlags<FramePipelinePassFlag>
|
||||||
|
{
|
||||||
|
static constexpr FramePipelinePassFlag max = FramePipelinePassFlag::Max;
|
||||||
|
};
|
||||||
|
|
||||||
|
using FramePipelinePassFlags = Flags<FramePipelinePassFlag>;
|
||||||
|
|
||||||
enum class MaterialPropertyType
|
enum class MaterialPropertyType
|
||||||
{
|
{
|
||||||
Bool,
|
Bool,
|
||||||
|
|
@ -116,20 +145,6 @@ namespace Nz
|
||||||
Orthographic,
|
Orthographic,
|
||||||
Perspective
|
Perspective
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class EngineShaderBinding
|
|
||||||
{
|
|
||||||
InstanceDataUbo,
|
|
||||||
LightDataUbo,
|
|
||||||
OverlayTexture,
|
|
||||||
ShadowmapDirectional,
|
|
||||||
ShadowmapPoint,
|
|
||||||
ShadowmapSpot,
|
|
||||||
SkeletalDataUbo,
|
|
||||||
ViewerDataUbo,
|
|
||||||
|
|
||||||
Max = ViewerDataUbo
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // NAZARA_GRAPHICS_ENUMS_HPP
|
#endif // NAZARA_GRAPHICS_ENUMS_HPP
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
#define NAZARA_GRAPHICS_FORWARDPIPELINEPASS_HPP
|
#define NAZARA_GRAPHICS_FORWARDPIPELINEPASS_HPP
|
||||||
|
|
||||||
#include <NazaraUtils/Prerequisites.hpp>
|
#include <NazaraUtils/Prerequisites.hpp>
|
||||||
|
#include <Nazara/Core/ParameterList.hpp>
|
||||||
#include <Nazara/Graphics/Config.hpp>
|
#include <Nazara/Graphics/Config.hpp>
|
||||||
#include <Nazara/Graphics/ElementRenderer.hpp>
|
#include <Nazara/Graphics/ElementRenderer.hpp>
|
||||||
#include <Nazara/Graphics/FramePipelinePass.hpp>
|
#include <Nazara/Graphics/FramePipelinePass.hpp>
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,11 @@
|
||||||
#include <NazaraUtils/Prerequisites.hpp>
|
#include <NazaraUtils/Prerequisites.hpp>
|
||||||
#include <Nazara/Core/ParameterList.hpp>
|
#include <Nazara/Core/ParameterList.hpp>
|
||||||
#include <Nazara/Graphics/Config.hpp>
|
#include <Nazara/Graphics/Config.hpp>
|
||||||
|
#include <Nazara/Graphics/Enums.hpp>
|
||||||
#include <Nazara/Graphics/FramePassAttachment.hpp>
|
#include <Nazara/Graphics/FramePassAttachment.hpp>
|
||||||
#include <Nazara/Graphics/FramePipelinePass.hpp>
|
#include <Nazara/Graphics/FramePipelinePass.hpp>
|
||||||
#include <NazaraUtils/FixedVector.hpp>
|
#include <NazaraUtils/FixedVector.hpp>
|
||||||
|
#include <NazaraUtils/FunctionRef.hpp>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
@ -34,13 +36,16 @@ namespace Nz
|
||||||
|
|
||||||
std::vector<std::unique_ptr<FramePipelinePass>> BuildPasses(FramePipelinePass::PassData& passData) const;
|
std::vector<std::unique_ptr<FramePipelinePass>> BuildPasses(FramePipelinePass::PassData& passData) const;
|
||||||
|
|
||||||
std::size_t RegisterPasses(const std::vector<std::unique_ptr<FramePipelinePass>>& passes, FrameGraph& frameGraph) const;
|
inline void EnablePassFlags(std::size_t passIndex, FramePipelinePassFlags flags);
|
||||||
|
|
||||||
|
std::size_t RegisterPasses(const std::vector<std::unique_ptr<FramePipelinePass>>& passes, FrameGraph& frameGraph, const FunctionRef<void(std::size_t passIndex, FramePass& framePass, FramePipelinePassFlags flags)>& passCallback = nullptr) const;
|
||||||
|
|
||||||
inline void SetFinalOutput(std::size_t attachmentIndex);
|
inline void SetFinalOutput(std::size_t attachmentIndex);
|
||||||
inline void SetPassInput(std::size_t passIndex, std::size_t inputIndex, std::size_t attachmentIndex);
|
|
||||||
inline void SetPassOutput(std::size_t passIndex, std::size_t outputIndex, std::size_t attachmentIndex);
|
|
||||||
inline void SetPassDepthStencilInput(std::size_t passIndex, std::size_t attachmentIndex);
|
inline void SetPassDepthStencilInput(std::size_t passIndex, std::size_t attachmentIndex);
|
||||||
inline void SetPassDepthStencilOutput(std::size_t passIndex, std::size_t attachmentIndex);
|
inline void SetPassDepthStencilOutput(std::size_t passIndex, std::size_t attachmentIndex);
|
||||||
|
inline void SetPassInput(std::size_t passIndex, std::size_t inputIndex, std::size_t attachmentIndex);
|
||||||
|
inline void SetPassOutput(std::size_t passIndex, std::size_t outputIndex, std::size_t attachmentIndex);
|
||||||
|
|
||||||
PipelinePassList& operator=(const PipelinePassList&) = delete;
|
PipelinePassList& operator=(const PipelinePassList&) = delete;
|
||||||
PipelinePassList& operator=(PipelinePassList&&) = delete;
|
PipelinePassList& operator=(PipelinePassList&&) = delete;
|
||||||
|
|
@ -52,12 +57,13 @@ namespace Nz
|
||||||
|
|
||||||
struct Pass
|
struct Pass
|
||||||
{
|
{
|
||||||
FixedVector<std::size_t /*attachmentIndex*/, MaxPassAttachment> inputs;
|
|
||||||
FixedVector<std::size_t /*attachmentIndex*/, MaxPassAttachment> outputs;
|
|
||||||
std::size_t depthStencilInput = NoAttachment;
|
std::size_t depthStencilInput = NoAttachment;
|
||||||
std::size_t depthStencilOutput = NoAttachment;
|
std::size_t depthStencilOutput = NoAttachment;
|
||||||
std::size_t implIndex;
|
std::size_t implIndex;
|
||||||
std::string name;
|
std::string name;
|
||||||
|
FixedVector<std::size_t /*attachmentIndex*/, MaxPassAttachment> inputs;
|
||||||
|
FixedVector<std::size_t /*attachmentIndex*/, MaxPassAttachment> outputs;
|
||||||
|
FramePipelinePassFlags flags;
|
||||||
ParameterList parameterList;
|
ParameterList parameterList;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,13 @@ namespace Nz
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void PipelinePassList::EnablePassFlags(std::size_t passIndex, FramePipelinePassFlags flags)
|
||||||
|
{
|
||||||
|
assert(passIndex < m_passes.size());
|
||||||
|
auto& pass = m_passes[passIndex];
|
||||||
|
pass.flags = flags;
|
||||||
|
}
|
||||||
|
|
||||||
inline void PipelinePassList::SetFinalOutput(std::size_t attachmentIndex)
|
inline void PipelinePassList::SetFinalOutput(std::size_t attachmentIndex)
|
||||||
{
|
{
|
||||||
m_finalOutputAttachment = attachmentIndex;
|
m_finalOutputAttachment = attachmentIndex;
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,15 @@
|
||||||
|
|
||||||
#include <NazaraUtils/Prerequisites.hpp>
|
#include <NazaraUtils/Prerequisites.hpp>
|
||||||
#include <Nazara/Graphics/AbstractViewer.hpp>
|
#include <Nazara/Graphics/AbstractViewer.hpp>
|
||||||
|
#include <Nazara/Graphics/Enums.hpp>
|
||||||
#include <Nazara/Graphics/FramePipelinePass.hpp>
|
#include <Nazara/Graphics/FramePipelinePass.hpp>
|
||||||
|
#include <NazaraUtils/FunctionRef.hpp>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace Nz
|
namespace Nz
|
||||||
{
|
{
|
||||||
|
class FramePass;
|
||||||
|
|
||||||
class NAZARA_GRAPHICS_API PipelineViewer : public AbstractViewer
|
class NAZARA_GRAPHICS_API PipelineViewer : public AbstractViewer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
@ -24,7 +28,7 @@ namespace Nz
|
||||||
|
|
||||||
virtual std::vector<std::unique_ptr<FramePipelinePass>> BuildPasses(FramePipelinePass::PassData& passData) const = 0;
|
virtual std::vector<std::unique_ptr<FramePipelinePass>> BuildPasses(FramePipelinePass::PassData& passData) const = 0;
|
||||||
|
|
||||||
virtual std::size_t RegisterPasses(const std::vector<std::unique_ptr<FramePipelinePass>>& passes, FrameGraph& frameGraph) const = 0;
|
virtual std::size_t RegisterPasses(const std::vector<std::unique_ptr<FramePipelinePass>>& passes, FrameGraph& frameGraph, const FunctionRef<void(std::size_t passIndex, FramePass& framePass, FramePipelinePassFlags flags)>& passCallback = nullptr) const = 0;
|
||||||
|
|
||||||
PipelineViewer& operator=(const PipelineViewer&) = delete;
|
PipelineViewer& operator=(const PipelineViewer&) = delete;
|
||||||
PipelineViewer& operator=(PipelineViewer&&) = delete;
|
PipelineViewer& operator=(PipelineViewer&&) = delete;
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
#define NAZARA_GRAPHICS_POSTPROCESSPIPELINEPASS_HPP
|
#define NAZARA_GRAPHICS_POSTPROCESSPIPELINEPASS_HPP
|
||||||
|
|
||||||
#include <NazaraUtils/Prerequisites.hpp>
|
#include <NazaraUtils/Prerequisites.hpp>
|
||||||
|
#include <Nazara/Core/ParameterList.hpp>
|
||||||
#include <Nazara/Graphics/Config.hpp>
|
#include <Nazara/Graphics/Config.hpp>
|
||||||
#include <Nazara/Graphics/FramePipelinePass.hpp>
|
#include <Nazara/Graphics/FramePipelinePass.hpp>
|
||||||
#include <Nazara/Graphics/UberShader.hpp>
|
#include <Nazara/Graphics/UberShader.hpp>
|
||||||
|
|
@ -17,7 +18,6 @@ namespace Nz
|
||||||
class FrameGraph;
|
class FrameGraph;
|
||||||
class FramePass;
|
class FramePass;
|
||||||
class FramePipeline;
|
class FramePipeline;
|
||||||
class ParameterList;
|
|
||||||
class RenderFrame;
|
class RenderFrame;
|
||||||
class RenderPipeline;
|
class RenderPipeline;
|
||||||
class ShaderBinding;
|
class ShaderBinding;
|
||||||
|
|
|
||||||
|
|
@ -55,10 +55,10 @@ namespace Nz
|
||||||
return m_viewport;
|
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);
|
assert(m_framePipelinePasses);
|
||||||
return m_framePipelinePasses->RegisterPasses(passes, frameGraph);
|
return m_framePipelinePasses->RegisterPasses(passes, frameGraph, passCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::UpdateTarget(const RenderTarget* renderTarget)
|
void Camera::UpdateTarget(const RenderTarget* renderTarget)
|
||||||
|
|
|
||||||
|
|
@ -713,7 +713,20 @@ namespace Nz
|
||||||
lightData->shadowData->RegisterToFrameGraph(frameGraph, viewerData.viewer);
|
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*>;
|
using ViewerPair = std::pair<const RenderTarget*, const ViewerData*>;
|
||||||
|
|
|
||||||
|
|
@ -390,6 +390,8 @@ namespace Nz
|
||||||
m_defaultPipelinePasses->SetPassOutput(forwardPass, 0, forwardColorOutput);
|
m_defaultPipelinePasses->SetPassOutput(forwardPass, 0, forwardColorOutput);
|
||||||
m_defaultPipelinePasses->SetPassDepthStencilOutput(forwardPass, forwardDepthOutput);
|
m_defaultPipelinePasses->SetPassDepthStencilOutput(forwardPass, forwardDepthOutput);
|
||||||
|
|
||||||
|
m_defaultPipelinePasses->EnablePassFlags(forwardPass, FramePipelinePassFlag::LightShadowing);
|
||||||
|
|
||||||
// Gamma correction
|
// Gamma correction
|
||||||
std::size_t gammaCorrectionOutput = m_defaultPipelinePasses->AddAttachment({
|
std::size_t gammaCorrectionOutput = m_defaultPipelinePasses->AddAttachment({
|
||||||
"Gamma-corrected output",
|
"Gamma-corrected output",
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ namespace Nz
|
||||||
return passes;
|
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");
|
NazaraAssert(m_passes.size() == passes.size(), "pass vector size doesn't match passlist size");
|
||||||
|
|
||||||
|
|
@ -39,17 +39,17 @@ namespace Nz
|
||||||
return attachmentIndices[attachmentIndex];
|
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;
|
std::array<std::size_t, MaxPassAttachment> inputs;
|
||||||
for (std::size_t j = 0; j < passData.inputs.size(); ++j)
|
for (std::size_t i = 0; i < passData.inputs.size(); ++i)
|
||||||
inputs[j] = GetAttachmentIndex(passData.inputs[j]);
|
inputs[i] = GetAttachmentIndex(passData.inputs[i]);
|
||||||
|
|
||||||
std::array<std::size_t, MaxPassAttachment> outputs;
|
std::array<std::size_t, MaxPassAttachment> outputs;
|
||||||
for (std::size_t j = 0; j < passData.outputs.size(); ++j)
|
for (std::size_t i = 0; i < passData.outputs.size(); ++i)
|
||||||
outputs[j] = GetAttachmentIndex(passData.outputs[j]);
|
outputs[i] = GetAttachmentIndex(passData.outputs[i]);
|
||||||
|
|
||||||
FramePipelinePass::PassInputOuputs passInputOuputs;
|
FramePipelinePass::PassInputOuputs passInputOuputs;
|
||||||
passInputOuputs.depthStencilInput = GetAttachmentIndex(passData.depthStencilInput);
|
passInputOuputs.depthStencilInput = GetAttachmentIndex(passData.depthStencilInput);
|
||||||
|
|
@ -59,7 +59,9 @@ namespace Nz
|
||||||
passInputOuputs.outputAttachments = outputs.data();
|
passInputOuputs.outputAttachments = outputs.data();
|
||||||
passInputOuputs.outputCount = passData.outputs.size();
|
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);
|
return GetAttachmentIndex(m_finalOutputAttachment);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue