Wire depth and shadow requests through camera renderer

This commit is contained in:
2026-04-04 14:41:01 +08:00
parent 9e8810e593
commit 1a236b866d
6 changed files with 323 additions and 7 deletions

View File

@@ -13,6 +13,31 @@ class Scene;
namespace Rendering {
struct ScenePassRenderRequest {
RenderSurface surface;
RenderClearFlags clearFlags = RenderClearFlags::Depth;
bool hasClearColorOverride = false;
Math::Color clearColorOverride = Math::Color::Black();
bool hasCameraDataOverride = false;
RenderCameraData cameraDataOverride = {};
bool IsRequested() const {
return !surface.GetColorAttachments().empty();
}
bool IsValid() const {
const std::vector<RHI::RHIResourceView*>& colorAttachments = surface.GetColorAttachments();
return !colorAttachments.empty() &&
colorAttachments[0] != nullptr &&
surface.GetDepthAttachment() != nullptr &&
surface.GetRenderAreaWidth() > 0 &&
surface.GetRenderAreaHeight() > 0;
}
};
using DepthOnlyRenderRequest = ScenePassRenderRequest;
using ShadowCasterRenderRequest = ScenePassRenderRequest;
struct ObjectIdRenderRequest {
RenderSurface surface;
@@ -35,6 +60,8 @@ struct CameraRenderRequest {
Components::CameraComponent* camera = nullptr;
RenderContext context;
RenderSurface surface;
DepthOnlyRenderRequest depthOnly;
ShadowCasterRenderRequest shadowCaster;
ObjectIdRenderRequest objectId;
float cameraDepth = 0.0f;
uint8_t cameraStackOrder = 0;

View File

@@ -24,15 +24,21 @@ public:
explicit CameraRenderer(std::shared_ptr<const RenderPipelineAsset> pipelineAsset);
CameraRenderer(
std::unique_ptr<RenderPipeline> pipeline,
std::unique_ptr<ObjectIdPass> objectIdPass);
std::unique_ptr<ObjectIdPass> objectIdPass,
std::unique_ptr<RenderPass> depthOnlyPass = nullptr,
std::unique_ptr<RenderPass> shadowCasterPass = nullptr);
~CameraRenderer();
void SetPipeline(std::unique_ptr<RenderPipeline> pipeline);
void SetPipelineAsset(std::shared_ptr<const RenderPipelineAsset> pipelineAsset);
void SetObjectIdPass(std::unique_ptr<ObjectIdPass> objectIdPass);
void SetDepthOnlyPass(std::unique_ptr<RenderPass> depthOnlyPass);
void SetShadowCasterPass(std::unique_ptr<RenderPass> shadowCasterPass);
RenderPipeline* GetPipeline() const { return m_pipeline.get(); }
const RenderPipelineAsset* GetPipelineAsset() const { return m_pipelineAsset.get(); }
ObjectIdPass* GetObjectIdPass() const { return m_objectIdPass.get(); }
RenderPass* GetDepthOnlyPass() const { return m_depthOnlyPass.get(); }
RenderPass* GetShadowCasterPass() const { return m_shadowCasterPass.get(); }
bool Render(const CameraRenderRequest& request);
@@ -43,6 +49,8 @@ private:
std::shared_ptr<const RenderPipelineAsset> m_pipelineAsset;
std::unique_ptr<RenderPipeline> m_pipeline;
std::unique_ptr<ObjectIdPass> m_objectIdPass;
std::unique_ptr<RenderPass> m_depthOnlyPass;
std::unique_ptr<RenderPass> m_shadowCasterPass;
};
} // namespace Rendering