refactor: unify builtin forward scene execution

This commit is contained in:
2026-04-10 02:56:36 +08:00
parent ff6d6d31fe
commit 57331c1c25
2 changed files with 126 additions and 126 deletions

View File

@@ -15,88 +15,6 @@
namespace XCEngine {
namespace Rendering {
namespace Pipelines {
namespace Internal {
class BuiltinForwardOpaquePass final : public RenderPass {
public:
explicit BuiltinForwardOpaquePass(BuiltinForwardPipeline& pipeline)
: m_pipeline(pipeline) {
}
const char* GetName() const override {
return "BuiltinForwardOpaquePass";
}
bool Initialize(const RenderContext& context) override {
return m_pipeline.EnsureInitialized(context);
}
void Shutdown() override {
m_pipeline.DestroyPipelineResources();
}
bool Execute(const RenderPassContext& context) override {
return m_pipeline.ExecuteForwardOpaquePass(context);
}
private:
BuiltinForwardPipeline& m_pipeline;
};
class BuiltinForwardSkyboxPass final : public RenderPass {
public:
explicit BuiltinForwardSkyboxPass(BuiltinForwardPipeline& pipeline)
: m_pipeline(pipeline) {
}
const char* GetName() const override {
return "BuiltinForwardSkyboxPass";
}
bool Initialize(const RenderContext& context) override {
return m_pipeline.EnsureInitialized(context);
}
void Shutdown() override {
m_pipeline.DestroyPipelineResources();
}
bool Execute(const RenderPassContext& context) override {
return m_pipeline.ExecuteForwardSkyboxPass(context);
}
private:
BuiltinForwardPipeline& m_pipeline;
};
class BuiltinForwardTransparentPass final : public RenderPass {
public:
explicit BuiltinForwardTransparentPass(BuiltinForwardPipeline& pipeline)
: m_pipeline(pipeline) {
}
const char* GetName() const override {
return "BuiltinForwardTransparentPass";
}
bool Initialize(const RenderContext& context) override {
return m_pipeline.EnsureInitialized(context);
}
void Shutdown() override {
m_pipeline.DestroyPipelineResources();
}
bool Execute(const RenderPassContext& context) override {
return m_pipeline.ExecuteForwardTransparentPass(context);
}
private:
BuiltinForwardPipeline& m_pipeline;
};
} // namespace Internal
namespace {
bool IsDepthFormat(RHI::Format format) {
@@ -104,6 +22,30 @@ bool IsDepthFormat(RHI::Format format) {
format == RHI::Format::D32_Float;
}
bool ShouldSampleMainDirectionalShadowMap(const RenderSceneData& sceneData) {
return sceneData.lighting.HasMainDirectionalShadow() &&
sceneData.lighting.mainDirectionalShadow.shadowMap != nullptr &&
IsDepthFormat(sceneData.lighting.mainDirectionalShadow.shadowMap->GetFormat());
}
void TransitionMainDirectionalShadowForSampling(
const RenderContext& context,
const RenderSceneData& sceneData) {
context.commandList->TransitionBarrier(
sceneData.lighting.mainDirectionalShadow.shadowMap,
RHI::ResourceStates::DepthWrite,
RHI::ResourceStates::PixelShaderResource);
}
void RestoreMainDirectionalShadowAfterSampling(
const RenderContext& context,
const RenderSceneData& sceneData) {
context.commandList->TransitionBarrier(
sceneData.lighting.mainDirectionalShadow.shadowMap,
RHI::ResourceStates::PixelShaderResource,
RHI::ResourceStates::DepthWrite);
}
std::vector<RHI::RHIResourceView*> CollectSurfaceColorAttachments(const RenderSurface& surface) {
std::vector<RHI::RHIResourceView*> renderTargets;
const Core::uint32 colorAttachmentCount =
@@ -124,10 +66,7 @@ std::vector<RHI::RHIResourceView*> CollectSurfaceColorAttachments(const RenderSu
} // namespace
BuiltinForwardPipeline::BuiltinForwardPipeline() {
m_passSequence.AddPass(std::make_unique<Internal::BuiltinForwardOpaquePass>(*this));
m_passSequence.AddPass(std::make_unique<Internal::BuiltinForwardSkyboxPass>(*this));
m_passSequence.AddPass(std::make_unique<Passes::BuiltinVolumetricPass>());
m_passSequence.AddPass(std::make_unique<Internal::BuiltinForwardTransparentPass>(*this));
m_volumetricPass = std::make_unique<Passes::BuiltinVolumetricPass>();
}
BuiltinForwardPipeline::~BuiltinForwardPipeline() {
@@ -169,11 +108,16 @@ RHI::InputLayoutDesc BuiltinForwardPipeline::BuildInputLayout() {
}
bool BuiltinForwardPipeline::Initialize(const RenderContext& context) {
return m_passSequence.Initialize(context);
return EnsureInitialized(context) &&
m_volumetricPass != nullptr &&
m_volumetricPass->Initialize(context);
}
void BuiltinForwardPipeline::Shutdown() {
m_passSequence.Shutdown();
if (m_volumetricPass != nullptr) {
m_volumetricPass->Shutdown();
}
DestroyPipelineResources();
}
bool BuiltinForwardPipeline::Render(
@@ -193,7 +137,32 @@ bool BuiltinForwardPipeline::Render(
RHI::ResourceStates::Common
};
return m_passSequence.Execute(passContext);
if (!BeginForwardScenePass(passContext)) {
return false;
}
const bool sampledDirectionalShadow = ShouldSampleMainDirectionalShadowMap(sceneData);
if (sampledDirectionalShadow) {
TransitionMainDirectionalShadowForSampling(context, sceneData);
}
bool renderResult = ExecuteForwardOpaquePass(passContext);
if (renderResult) {
renderResult = ExecuteForwardSkyboxPass(passContext);
}
if (renderResult && m_volumetricPass != nullptr) {
renderResult = m_volumetricPass->Execute(passContext);
}
if (renderResult) {
renderResult = ExecuteForwardTransparentPass(passContext);
}
if (sampledDirectionalShadow) {
RestoreMainDirectionalShadowAfterSampling(context, sceneData);
}
EndForwardScenePass(passContext);
return renderResult;
}
bool BuiltinForwardPipeline::BeginForwardScenePass(const RenderPassContext& passContext) {
@@ -309,18 +278,6 @@ bool BuiltinForwardPipeline::ExecuteForwardOpaquePass(const RenderPassContext& p
const RenderSurface& surface = passContext.surface;
const RenderSceneData& sceneData = passContext.sceneData;
if (!BeginForwardScenePass(passContext)) {
return false;
}
if (sceneData.lighting.HasMainDirectionalShadow() &&
IsDepthFormat(sceneData.lighting.mainDirectionalShadow.shadowMap->GetFormat())) {
context.commandList->TransitionBarrier(
sceneData.lighting.mainDirectionalShadow.shadowMap,
RHI::ResourceStates::DepthWrite,
RHI::ResourceStates::PixelShaderResource);
}
return DrawVisibleItems(context, surface, sceneData, false);
}
@@ -329,19 +286,7 @@ bool BuiltinForwardPipeline::ExecuteForwardTransparentPass(const RenderPassConte
const RenderSurface& surface = passContext.surface;
const RenderSceneData& sceneData = passContext.sceneData;
const bool drawResult = DrawVisibleItems(context, surface, sceneData, true);
if (sceneData.lighting.HasMainDirectionalShadow() &&
IsDepthFormat(sceneData.lighting.mainDirectionalShadow.shadowMap->GetFormat())) {
context.commandList->TransitionBarrier(
sceneData.lighting.mainDirectionalShadow.shadowMap,
RHI::ResourceStates::PixelShaderResource,
RHI::ResourceStates::DepthWrite);
}
EndForwardScenePass(passContext);
return drawResult;
return DrawVisibleItems(context, surface, sceneData, true);
}
bool BuiltinForwardPipeline::DrawVisibleItems(