Formalize final color policy resolution

This commit is contained in:
2026-04-06 15:55:50 +08:00
parent b6132aec4d
commit 6645d507d0
12 changed files with 765 additions and 4 deletions

View File

@@ -276,6 +276,16 @@ void CameraComponent::Serialize(std::ostream& os) const {
os << "skyboxTopColor=" << m_skyboxTopColor.r << "," << m_skyboxTopColor.g << "," << m_skyboxTopColor.b << "," << m_skyboxTopColor.a << ";";
os << "skyboxHorizonColor=" << m_skyboxHorizonColor.r << "," << m_skyboxHorizonColor.g << "," << m_skyboxHorizonColor.b << "," << m_skyboxHorizonColor.a << ";";
os << "skyboxBottomColor=" << m_skyboxBottomColor.r << "," << m_skyboxBottomColor.g << "," << m_skyboxBottomColor.b << "," << m_skyboxBottomColor.a << ";";
os << "finalColorOverrideOutputTransferEnabled=" << (m_finalColorOverrides.overrideOutputTransferMode ? 1 : 0) << ";";
os << "finalColorOverrideOutputTransferMode=" << static_cast<int>(m_finalColorOverrides.outputTransferMode) << ";";
os << "finalColorOverrideExposureModeEnabled=" << (m_finalColorOverrides.overrideExposureMode ? 1 : 0) << ";";
os << "finalColorOverrideExposureMode=" << static_cast<int>(m_finalColorOverrides.exposureMode) << ";";
os << "finalColorOverrideExposureValueEnabled=" << (m_finalColorOverrides.overrideExposureValue ? 1 : 0) << ";";
os << "finalColorOverrideExposureValue=" << m_finalColorOverrides.exposureValue << ";";
os << "finalColorOverrideToneMappingModeEnabled=" << (m_finalColorOverrides.overrideToneMappingMode ? 1 : 0) << ";";
os << "finalColorOverrideToneMappingMode=" << static_cast<int>(m_finalColorOverrides.toneMappingMode) << ";";
os << "finalColorOverrideScaleEnabled=" << (m_finalColorOverrides.overrideFinalColorScale ? 1 : 0) << ";";
os << "finalColorOverrideScale=" << EncodeVector4(m_finalColorOverrides.finalColorScale) << ";";
os << "postProcessPassCount=" << m_postProcessPasses.size() << ";";
for (size_t index = 0; index < m_postProcessPasses.size(); ++index) {
const Rendering::CameraPostProcessPassDesc& pass = m_postProcessPasses[index];
@@ -295,6 +305,7 @@ void CameraComponent::Deserialize(std::istream& is) {
m_skyboxMaterial.Reset();
m_skyboxMaterialPath.clear();
m_skyboxMaterialRef.Reset();
m_finalColorOverrides = {};
m_colorScalePostProcessDefaultScale = Math::Vector4::One();
m_postProcessPasses.clear();
@@ -367,6 +378,29 @@ void CameraComponent::Deserialize(std::istream& is) {
std::replace(value.begin(), value.end(), ',', ' ');
std::istringstream ss(value);
ss >> m_skyboxBottomColor.r >> m_skyboxBottomColor.g >> m_skyboxBottomColor.b >> m_skyboxBottomColor.a;
} else if (key == "finalColorOverrideOutputTransferEnabled") {
m_finalColorOverrides.overrideOutputTransferMode = (std::stoi(value) != 0);
} else if (key == "finalColorOverrideOutputTransferMode") {
m_finalColorOverrides.outputTransferMode =
static_cast<Rendering::FinalColorOutputTransferMode>(std::stoi(value));
} else if (key == "finalColorOverrideExposureModeEnabled") {
m_finalColorOverrides.overrideExposureMode = (std::stoi(value) != 0);
} else if (key == "finalColorOverrideExposureMode") {
m_finalColorOverrides.exposureMode =
static_cast<Rendering::FinalColorExposureMode>(std::stoi(value));
} else if (key == "finalColorOverrideExposureValueEnabled") {
m_finalColorOverrides.overrideExposureValue = (std::stoi(value) != 0);
} else if (key == "finalColorOverrideExposureValue") {
m_finalColorOverrides.exposureValue = std::stof(value);
} else if (key == "finalColorOverrideToneMappingModeEnabled") {
m_finalColorOverrides.overrideToneMappingMode = (std::stoi(value) != 0);
} else if (key == "finalColorOverrideToneMappingMode") {
m_finalColorOverrides.toneMappingMode =
static_cast<Rendering::FinalColorToneMappingMode>(std::stoi(value));
} else if (key == "finalColorOverrideScaleEnabled") {
m_finalColorOverrides.overrideFinalColorScale = (std::stoi(value) != 0);
} else if (key == "finalColorOverrideScale") {
TryParseVector4(value, m_finalColorOverrides.finalColorScale);
} else if (key == "postProcessPassCount") {
postProcessPassCount = static_cast<size_t>(std::stoul(value));
deserializedPostProcessPasses.clear();

View File

@@ -4,6 +4,7 @@
#include "Rendering/Caches/FullscreenPassSurfaceCache.h"
#include "Rendering/Planning/CameraPostProcessPassFactory.h"
#include "Rendering/Planning/SceneRenderRequestUtils.h"
#include "Rendering/RenderPipelineAsset.h"
namespace XCEngine {
namespace Rendering {
@@ -35,6 +36,7 @@ std::vector<CameraRenderRequest> SceneRenderer::BuildRenderRequests(
const RenderSurface& surface) {
std::vector<CameraRenderRequest> requests =
m_requestPlanner.BuildRequests(scene, overrideCamera, context, surface);
ResolveCameraFinalColorPolicies(requests);
AttachCameraPostProcessRequests(context, requests);
return requests;
}
@@ -91,6 +93,24 @@ void SceneRenderer::PrepareOwnedCameraPostProcessState(size_t requestCount) {
}
}
void SceneRenderer::ResolveCameraFinalColorPolicies(
std::vector<CameraRenderRequest>& requests) const {
const RenderPipelineAsset* pipelineAsset = GetPipelineAsset();
const FinalColorSettings pipelineDefaults =
pipelineAsset != nullptr ? pipelineAsset->GetDefaultFinalColorSettings() : FinalColorSettings();
for (CameraRenderRequest& request : requests) {
if (request.camera == nullptr) {
continue;
}
request.finalColorPolicy = ResolveFinalColorPolicy(
pipelineDefaults,
&request.camera->GetFinalColorOverrides(),
nullptr);
}
}
void SceneRenderer::AttachCameraPostProcessRequests(
const RenderContext& context,
std::vector<CameraRenderRequest>& requests) {