Add builtin GaussianSplat forward pass baseline

This commit is contained in:
2026-04-10 23:11:11 +08:00
parent 15b42c248f
commit 107b320aa7
12 changed files with 1642 additions and 19 deletions

View File

@@ -4,6 +4,7 @@
#include "Core/Asset/ResourceManager.h"
#include "RHI/RHICommandList.h"
#include "Rendering/Internal/RenderSurfacePipelineUtils.h"
#include "Rendering/Passes/BuiltinGaussianSplatPass.h"
#include "Rendering/Materials/RenderMaterialResolve.h"
#include "Rendering/Passes/BuiltinVolumetricPass.h"
#include "Rendering/RenderSurface.h"
@@ -66,6 +67,7 @@ std::vector<RHI::RHIResourceView*> CollectSurfaceColorAttachments(const RenderSu
} // namespace
BuiltinForwardPipeline::BuiltinForwardPipeline() {
m_gaussianSplatPass = std::make_unique<Passes::BuiltinGaussianSplatPass>();
m_volumetricPass = std::make_unique<Passes::BuiltinVolumetricPass>();
}
@@ -109,11 +111,16 @@ RHI::InputLayoutDesc BuiltinForwardPipeline::BuildInputLayout() {
bool BuiltinForwardPipeline::Initialize(const RenderContext& context) {
return EnsureInitialized(context) &&
m_gaussianSplatPass != nullptr &&
m_gaussianSplatPass->Initialize(context) &&
m_volumetricPass != nullptr &&
m_volumetricPass->Initialize(context);
}
void BuiltinForwardPipeline::Shutdown() {
if (m_gaussianSplatPass != nullptr) {
m_gaussianSplatPass->Shutdown();
}
if (m_volumetricPass != nullptr) {
m_volumetricPass->Shutdown();
}
@@ -128,6 +135,17 @@ bool BuiltinForwardPipeline::Render(
return false;
}
if (m_volumetricPass != nullptr &&
!sceneData.visibleVolumes.empty() &&
!m_volumetricPass->PrepareVolumeResources(context, sceneData)) {
return false;
}
if (m_gaussianSplatPass != nullptr &&
!sceneData.visibleGaussianSplats.empty() &&
!m_gaussianSplatPass->PrepareGaussianSplatResources(context, sceneData)) {
return false;
}
const RenderPassContext passContext = {
context,
surface,
@@ -150,6 +168,9 @@ bool BuiltinForwardPipeline::Render(
if (renderResult) {
renderResult = ExecuteForwardSkyboxPass(passContext);
}
if (renderResult && m_gaussianSplatPass != nullptr) {
renderResult = m_gaussianSplatPass->Execute(passContext);
}
if (renderResult && m_volumetricPass != nullptr) {
renderResult = m_volumetricPass->Execute(passContext);
}