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

@ -75,7 +75,7 @@ int main(int argc, char* argv[])
Nz::ElementRendererRegistry elementRegistry; Nz::ElementRendererRegistry elementRegistry;
Nz::ForwardFramePipeline framePipeline(elementRegistry); Nz::ForwardFramePipeline framePipeline(elementRegistry);
[[maybe_unused]] std::size_t cameraIndex = framePipeline.RegisterViewer(&camera, 0); [[maybe_unused]] std::size_t cameraIndex = framePipeline.RegisterViewer(&camera, 0, Nz::FramePipelineAllExtraPasses);
std::size_t worldInstanceIndex1 = framePipeline.RegisterWorldInstance(modelInstance); std::size_t worldInstanceIndex1 = framePipeline.RegisterWorldInstance(modelInstance);
framePipeline.RegisterRenderable(worldInstanceIndex1, Nz::FramePipeline::NoSkeletonInstance, &model, 0xFFFFFFFF, scissorBox); framePipeline.RegisterRenderable(worldInstanceIndex1, Nz::FramePipeline::NoSkeletonInstance, &model, 0xFFFFFFFF, scissorBox);

View File

@ -30,6 +30,8 @@ namespace Nz
inline float GetAspectRatio() const; inline float GetAspectRatio() const;
const Color& GetClearColor() const override; const Color& GetClearColor() const override;
inline DegreeAnglef GetFOV() const; inline DegreeAnglef GetFOV() const;
inline FramePipelineExtraPassFlags GetFramePipelineExtraPassFlags() const;
inline ProjectionType GetProjectionType() const;
UInt32 GetRenderMask() const override; UInt32 GetRenderMask() const override;
inline Int32 GetRenderOrder() const; inline Int32 GetRenderOrder() const;
const RenderTarget& GetRenderTarget() const override; const RenderTarget& GetRenderTarget() const override;
@ -43,6 +45,7 @@ namespace Nz
inline void UpdateClearColor(Color color); inline void UpdateClearColor(Color color);
inline void UpdateFOV(DegreeAnglef fov); inline void UpdateFOV(DegreeAnglef fov);
inline void UpdateFramePipelineExtraPassFlags(FramePipelineExtraPassFlags framePipelineExtraFlags);
inline void UpdateProjectionType(ProjectionType projectionType); inline void UpdateProjectionType(ProjectionType projectionType);
inline void UpdateRenderMask(UInt32 renderMask); inline void UpdateRenderMask(UInt32 renderMask);
inline void UpdateRenderOrder(Int32 renderOrder); inline void UpdateRenderOrder(Int32 renderOrder);
@ -67,6 +70,7 @@ namespace Nz
const RenderTarget* m_renderTarget; const RenderTarget* m_renderTarget;
Color m_clearColor; Color m_clearColor;
DegreeAnglef m_fov; DegreeAnglef m_fov;
FramePipelineExtraPassFlags m_framePipelineExtraPassFlags;
Int32 m_renderOrder; Int32 m_renderOrder;
ProjectionType m_projectionType; ProjectionType m_projectionType;
Rectf m_targetRegion; Rectf m_targetRegion;

View File

@ -11,6 +11,7 @@ namespace Nz
m_renderTarget(nullptr), m_renderTarget(nullptr),
m_clearColor(Color::Black()), m_clearColor(Color::Black()),
m_fov(90.f), m_fov(90.f),
m_framePipelineExtraPassFlags(FramePipelineExtraPass::DebugDraw),
m_renderOrder(0), m_renderOrder(0),
m_projectionType(projectionType), m_projectionType(projectionType),
m_targetRegion(0.f, 0.f, 1.f, 1.f), m_targetRegion(0.f, 0.f, 1.f, 1.f),
@ -20,6 +21,9 @@ namespace Nz
m_zFar((projectionType == ProjectionType::Perspective) ? 1000.f : 1.f), m_zFar((projectionType == ProjectionType::Perspective) ? 1000.f : 1.f),
m_zNear((projectionType == ProjectionType::Perspective) ? 1.f : -1.f) m_zNear((projectionType == ProjectionType::Perspective) ? 1.f : -1.f)
{ {
if (projectionType == ProjectionType::Perspective)
m_framePipelineExtraPassFlags |= FramePipelineExtraPass::DepthPrepass;
UpdateTarget(renderTarget); UpdateTarget(renderTarget);
} }
@ -27,6 +31,7 @@ namespace Nz
m_renderTarget(nullptr), m_renderTarget(nullptr),
m_clearColor(camera.m_clearColor), m_clearColor(camera.m_clearColor),
m_fov(camera.m_fov), m_fov(camera.m_fov),
m_framePipelineExtraPassFlags(camera.m_framePipelineExtraPassFlags),
m_renderOrder(camera.m_renderOrder), m_renderOrder(camera.m_renderOrder),
m_projectionType(camera.m_projectionType), m_projectionType(camera.m_projectionType),
m_targetRegion(camera.m_targetRegion), m_targetRegion(camera.m_targetRegion),
@ -44,6 +49,7 @@ namespace Nz
m_renderTarget(nullptr), m_renderTarget(nullptr),
m_clearColor(camera.m_clearColor), m_clearColor(camera.m_clearColor),
m_fov(camera.m_fov), m_fov(camera.m_fov),
m_framePipelineExtraPassFlags(camera.m_framePipelineExtraPassFlags),
m_renderOrder(camera.m_renderOrder), m_renderOrder(camera.m_renderOrder),
m_projectionType(camera.m_projectionType), m_projectionType(camera.m_projectionType),
m_targetRegion(camera.m_targetRegion), m_targetRegion(camera.m_targetRegion),
@ -67,6 +73,16 @@ namespace Nz
return m_fov; return m_fov;
} }
inline FramePipelineExtraPassFlags Camera::GetFramePipelineExtraPassFlags() const
{
return m_framePipelineExtraPassFlags;
}
inline ProjectionType Camera::GetProjectionType() const
{
return m_projectionType;
}
inline Int32 Camera::GetRenderOrder() const inline Int32 Camera::GetRenderOrder() const
{ {
return m_renderOrder; return m_renderOrder;
@ -103,6 +119,11 @@ namespace Nz
UpdateProjectionMatrix(); UpdateProjectionMatrix();
} }
inline void Camera::UpdateFramePipelineExtraPassFlags(FramePipelineExtraPassFlags framePipelineExtraFlags)
{
m_framePipelineExtraPassFlags = framePipelineExtraFlags;
}
inline void Camera::UpdateZFar(float zFar) inline void Camera::UpdateZFar(float zFar)
{ {
m_zFar = zFar; m_zFar = zFar;
@ -119,6 +140,7 @@ namespace Nz
inline Camera& Camera::operator=(const Camera& camera) inline Camera& Camera::operator=(const Camera& camera)
{ {
m_framePipelineExtraPassFlags = camera.m_framePipelineExtraPassFlags;
m_fov = camera.m_fov; m_fov = camera.m_fov;
m_projectionType = camera.m_projectionType; m_projectionType = camera.m_projectionType;
m_targetRegion = camera.m_targetRegion; m_targetRegion = camera.m_targetRegion;
@ -135,6 +157,7 @@ namespace Nz
inline Camera& Camera::operator=(Camera&& camera) noexcept inline Camera& Camera::operator=(Camera&& camera) noexcept
{ {
m_framePipelineExtraPassFlags = camera.m_framePipelineExtraPassFlags;
m_fov = camera.m_fov; m_fov = camera.m_fov;
m_projectionType = camera.m_projectionType; m_projectionType = camera.m_projectionType;
m_targetRegion = camera.m_targetRegion; m_targetRegion = camera.m_targetRegion;
@ -246,3 +269,4 @@ namespace Nz
} }
#include <Nazara/Graphics/DebugOff.hpp> #include <Nazara/Graphics/DebugOff.hpp>
#include "Camera.hpp"

View File

@ -41,6 +41,24 @@ namespace Nz
Volume Volume
}; };
enum class FramePipelineExtraPass
{
DebugDraw,
DepthPrepass,
Max = DepthPrepass
};
template<>
struct EnumAsFlags<FramePipelineExtraPass>
{
static constexpr FramePipelineExtraPass max = FramePipelineExtraPass::Max;
};
using FramePipelineExtraPassFlags = Flags<FramePipelineExtraPass>;
constexpr FramePipelineExtraPassFlags FramePipelineAllExtraPasses = FramePipelineExtraPass::DebugDraw | FramePipelineExtraPass::DepthPrepass;
enum class MaterialPropertyType enum class MaterialPropertyType
{ {
Bool, Bool,

View File

@ -54,7 +54,7 @@ namespace Nz
std::size_t RegisterLight(const Light* light, UInt32 renderMask) override; std::size_t RegisterLight(const Light* light, UInt32 renderMask) override;
std::size_t RegisterRenderable(std::size_t worldInstanceIndex, std::size_t skeletonInstanceIndex, const InstancedRenderable* instancedRenderable, UInt32 renderMask, const Recti& scissorBox) override; std::size_t RegisterRenderable(std::size_t worldInstanceIndex, std::size_t skeletonInstanceIndex, const InstancedRenderable* instancedRenderable, UInt32 renderMask, const Recti& scissorBox) override;
std::size_t RegisterSkeleton(SkeletonInstancePtr skeletonInstance) override; std::size_t RegisterSkeleton(SkeletonInstancePtr skeletonInstance) override;
std::size_t RegisterViewer(AbstractViewer* viewerInstance, Int32 renderOrder) override; std::size_t RegisterViewer(AbstractViewer* viewerInstance, Int32 renderOrder, FramePipelineExtraPassFlags passFlags) override;
std::size_t RegisterWorldInstance(WorldInstancePtr worldInstance) override; std::size_t RegisterWorldInstance(WorldInstancePtr worldInstance) override;
const Light* RetrieveLight(std::size_t lightIndex) const override; const Light* RetrieveLight(std::size_t lightIndex) const override;
@ -131,6 +131,7 @@ namespace Nz
struct ViewerData struct ViewerData
{ {
std::size_t finalColorAttachment;
std::size_t forwardColorAttachment; std::size_t forwardColorAttachment;
std::size_t debugColorAttachment; std::size_t debugColorAttachment;
std::size_t depthStencilAttachment; std::size_t depthStencilAttachment;

View File

@ -46,7 +46,7 @@ namespace Nz
virtual std::size_t RegisterLight(const Light* light, UInt32 renderMask) = 0; virtual std::size_t RegisterLight(const Light* light, UInt32 renderMask) = 0;
virtual std::size_t RegisterRenderable(std::size_t worldInstanceIndex, std::size_t skeletonInstanceIndex, const InstancedRenderable* instancedRenderable, UInt32 renderMask, const Recti& scissorBox) = 0; virtual std::size_t RegisterRenderable(std::size_t worldInstanceIndex, std::size_t skeletonInstanceIndex, const InstancedRenderable* instancedRenderable, UInt32 renderMask, const Recti& scissorBox) = 0;
virtual std::size_t RegisterSkeleton(SkeletonInstancePtr skeletonInstance) = 0; virtual std::size_t RegisterSkeleton(SkeletonInstancePtr skeletonInstance) = 0;
virtual std::size_t RegisterViewer(AbstractViewer* viewerInstance, Int32 renderOrder) = 0; virtual std::size_t RegisterViewer(AbstractViewer* viewerInstance, Int32 renderOrder, FramePipelineExtraPassFlags passFlags) = 0;
virtual std::size_t RegisterWorldInstance(WorldInstancePtr worldInstance) = 0; virtual std::size_t RegisterWorldInstance(WorldInstancePtr worldInstance) = 0;
virtual const Light* RetrieveLight(std::size_t lightIndex) const = 0; virtual const Light* RetrieveLight(std::size_t lightIndex) const = 0;

View File

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

View File

@ -330,7 +330,7 @@ namespace Nz
CameraEntity* cameraEntity = m_cameraEntityPool.Allocate(poolIndex); CameraEntity* cameraEntity = m_cameraEntityPool.Allocate(poolIndex);
cameraEntity->poolIndex = poolIndex; cameraEntity->poolIndex = poolIndex;
cameraEntity->entity = entity; 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*/) cameraEntity->onNodeInvalidation.Connect(entityNode.OnNodeInvalidation, [this, cameraEntity](const Node* /*node*/)
{ {
m_invalidatedCameraNode.insert(cameraEntity); m_invalidatedCameraNode.insert(cameraEntity);

View File

@ -93,7 +93,7 @@ int main()
Nz::ElementRendererRegistry elementRegistry; Nz::ElementRendererRegistry elementRegistry;
Nz::ForwardFramePipeline framePipeline(elementRegistry); Nz::ForwardFramePipeline framePipeline(elementRegistry);
[[maybe_unused]] std::size_t cameraIndex = framePipeline.RegisterViewer(&camera, 0); [[maybe_unused]] std::size_t cameraIndex = framePipeline.RegisterViewer(&camera, 0, Nz::FramePipelineAllExtraPasses);
std::size_t worldInstanceIndex1 = framePipeline.RegisterWorldInstance(modelInstance); std::size_t worldInstanceIndex1 = framePipeline.RegisterWorldInstance(modelInstance);
std::size_t worldInstanceIndex2 = framePipeline.RegisterWorldInstance(modelInstance2); std::size_t worldInstanceIndex2 = framePipeline.RegisterWorldInstance(modelInstance2);
framePipeline.RegisterRenderable(worldInstanceIndex1, Nz::FramePipeline::NoSkeletonInstance, &model, 0xFFFFFFFF, scissorBox); framePipeline.RegisterRenderable(worldInstanceIndex1, Nz::FramePipeline::NoSkeletonInstance, &model, 0xFFFFFFFF, scissorBox);