Refactor camera renderer orchestration

This commit is contained in:
2026-04-05 19:55:37 +08:00
parent 3dd8867a17
commit d52b85aff9
5 changed files with 343 additions and 269 deletions

View File

@@ -1,6 +1,7 @@
#pragma once
#include <XCEngine/Rendering/CameraRenderRequest.h>
#include <XCEngine/Rendering/RenderSceneExtractor.h>
#include <XCEngine/Rendering/RenderPass.h>
#include <XCEngine/Rendering/RenderPipeline.h>
@@ -12,8 +13,13 @@ class CameraComponent;
class Scene;
} // namespace Components
namespace RHI {
class RHIResourceView;
} // namespace RHI
namespace Rendering {
class DirectionalShadowSurfaceCache;
class RenderSurface;
class RenderPipelineAsset;
struct RenderContext;
@@ -44,12 +50,19 @@ public:
bool Render(const CameraRenderRequest& request);
private:
struct DirectionalShadowSurfaceResources;
void ResetPipeline(std::unique_ptr<RenderPipeline> pipeline);
DirectionalShadowSurfaceResources* AcquireDirectionalShadowSurface(
const RenderContext& context,
const DirectionalShadowRenderPlan& plan);
bool ResolveShadowCasterRequest(
const CameraRenderRequest& request,
ShadowCasterRenderRequest& outResolvedShadowCaster,
RHI::RHIResourceView*& outShadowMapView);
bool BuildSceneDataForRequest(
const CameraRenderRequest& request,
RHI::RHIResourceView* shadowMapView,
RenderSceneData& outSceneData);
bool ExecuteRenderPlan(
const CameraRenderRequest& request,
const ShadowCasterRenderRequest& resolvedShadowCaster,
const RenderSceneData& sceneData);
RenderSceneExtractor m_sceneExtractor;
std::shared_ptr<const RenderPipelineAsset> m_pipelineAsset;
@@ -57,7 +70,7 @@ private:
std::unique_ptr<RenderPass> m_objectIdPass;
std::unique_ptr<RenderPass> m_depthOnlyPass;
std::unique_ptr<RenderPass> m_shadowCasterPass;
std::unique_ptr<DirectionalShadowSurfaceResources> m_directionalShadowSurface;
std::unique_ptr<DirectionalShadowSurfaceCache> m_directionalShadowSurface;
};
} // namespace Rendering

View File

@@ -0,0 +1,43 @@
#pragma once
#include <XCEngine/Rendering/RenderSurface.h>
namespace XCEngine {
namespace RHI {
class RHIDevice;
class RHIResourceView;
class RHITexture;
} // namespace RHI
namespace Rendering {
struct DirectionalShadowRenderPlan;
struct RenderContext;
class DirectionalShadowSurfaceCache {
public:
DirectionalShadowSurfaceCache() = default;
DirectionalShadowSurfaceCache(const DirectionalShadowSurfaceCache&) = delete;
DirectionalShadowSurfaceCache& operator=(const DirectionalShadowSurfaceCache&) = delete;
~DirectionalShadowSurfaceCache();
bool EnsureSurface(const RenderContext& context, const DirectionalShadowRenderPlan& plan);
const RenderSurface& GetSurface() const { return m_surface; }
RHI::RHIResourceView* GetDepthShaderView() const { return m_depthShaderView; }
private:
bool Matches(const RenderContext& context, const DirectionalShadowRenderPlan& plan) const;
void Reset();
RHI::RHIDevice* m_device = nullptr;
uint32_t m_width = 0;
uint32_t m_height = 0;
RHI::RHITexture* m_depthTexture = nullptr;
RHI::RHIResourceView* m_depthView = nullptr;
RHI::RHIResourceView* m_depthShaderView = nullptr;
RenderSurface m_surface = {};
};
} // namespace Rendering
} // namespace XCEngine