Add request-level clear control for camera rendering

This commit is contained in:
2026-03-27 17:46:47 +08:00
parent cf8e669f75
commit 704d2067ce
6 changed files with 45 additions and 4 deletions

View File

@@ -1,5 +1,6 @@
#pragma once
#include <XCEngine/Rendering/RenderCameraData.h>
#include <XCEngine/Rendering/RenderContext.h>
#include <XCEngine/Rendering/RenderSurface.h>
@@ -17,6 +18,7 @@ struct CameraRenderRequest {
RenderContext context;
RenderSurface surface;
float cameraDepth = 0.0f;
RenderClearFlags clearFlags = RenderClearFlags::All;
bool IsValid() const {
return scene != nullptr &&

View File

@@ -9,12 +9,34 @@
namespace XCEngine {
namespace Rendering {
enum class RenderClearFlags : uint8_t {
None = 0,
Color = 1 << 0,
Depth = 1 << 1,
All = (1 << 0) | (1 << 1)
};
constexpr RenderClearFlags operator|(RenderClearFlags lhs, RenderClearFlags rhs) {
return static_cast<RenderClearFlags>(
static_cast<uint8_t>(lhs) | static_cast<uint8_t>(rhs));
}
constexpr RenderClearFlags operator&(RenderClearFlags lhs, RenderClearFlags rhs) {
return static_cast<RenderClearFlags>(
static_cast<uint8_t>(lhs) & static_cast<uint8_t>(rhs));
}
constexpr bool HasRenderClearFlag(RenderClearFlags flags, RenderClearFlags flag) {
return static_cast<uint8_t>(flags & flag) != 0;
}
struct RenderCameraData {
Math::Matrix4x4 view = Math::Matrix4x4::Identity();
Math::Matrix4x4 projection = Math::Matrix4x4::Identity();
Math::Matrix4x4 viewProjection = Math::Matrix4x4::Identity();
Math::Vector3 worldPosition = Math::Vector3::Zero();
Math::Color clearColor = Math::Color::Black();
RenderClearFlags clearFlags = RenderClearFlags::All;
uint32_t viewportWidth = 0;
uint32_t viewportHeight = 0;
};

View File

@@ -50,6 +50,7 @@ bool CameraRenderer::Render(
return false;
}
sceneData.cameraData.clearFlags = request.clearFlags;
return m_pipeline->Render(request.context, request.surface, sceneData);
}

View File

@@ -235,12 +235,15 @@ bool BuiltinForwardPipeline::Render(
? surface.GetClearColorOverride()
: sceneData.cameraData.clearColor;
const float clearValues[4] = { clearColor.r, clearColor.g, clearColor.b, clearColor.a };
for (RHI::RHIResourceView* renderTarget : renderTargets) {
if (renderTarget != nullptr) {
commandList->ClearRenderTarget(renderTarget, clearValues);
if (HasRenderClearFlag(sceneData.cameraData.clearFlags, RenderClearFlags::Color)) {
for (RHI::RHIResourceView* renderTarget : renderTargets) {
if (renderTarget != nullptr) {
commandList->ClearRenderTarget(renderTarget, clearValues);
}
}
}
if (surface.GetDepthAttachment() != nullptr) {
if (surface.GetDepthAttachment() != nullptr &&
HasRenderClearFlag(sceneData.cameraData.clearFlags, RenderClearFlags::Depth)) {
commandList->ClearDepthStencil(surface.GetDepthAttachment(), 1.0f, 0);
}

View File

@@ -47,6 +47,7 @@ std::vector<CameraRenderRequest> SceneRenderer::BuildRenderRequests(
request.context = context;
request.surface = surface;
request.cameraDepth = camera->GetDepth();
request.clearFlags = RenderClearFlags::All;
requests.push_back(request);
return requests;
}