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

@@ -279,6 +279,7 @@ private:
struct MockPipelineAssetState {
int createCalls = 0;
std::shared_ptr<MockPipelineState> lastCreatedPipelineState;
FinalColorSettings defaultFinalColorSettings = {};
};
class MockPipeline final : public RenderPipeline {
@@ -344,6 +345,10 @@ public:
return std::make_unique<MockPipeline>(m_state->lastCreatedPipelineState);
}
FinalColorSettings GetDefaultFinalColorSettings() const override {
return m_state->defaultFinalColorSettings;
}
private:
std::shared_ptr<MockPipelineAssetState> m_state;
};
@@ -1838,6 +1843,50 @@ TEST(SceneRenderer_Test, BuildsCameraColorScalePostProcessRequestFromCameraPassS
delete backBufferColorView;
}
TEST(SceneRenderer_Test, ResolvesFinalColorPolicyFromPipelineDefaultsAndCameraOverrides) {
Scene scene("SceneRendererFinalColorPolicyScene");
GameObject* cameraObject = scene.CreateGameObject("Camera");
auto* camera = cameraObject->AddComponent<CameraComponent>();
camera->SetPrimary(true);
camera->SetDepth(2.0f);
FinalColorOverrideSettings cameraOverrides = {};
cameraOverrides.overrideExposureValue = true;
cameraOverrides.exposureValue = 1.8f;
cameraOverrides.overrideFinalColorScale = true;
cameraOverrides.finalColorScale = XCEngine::Math::Vector4(0.95f, 0.9f, 0.85f, 1.0f);
camera->SetFinalColorOverrides(cameraOverrides);
auto assetState = std::make_shared<MockPipelineAssetState>();
assetState->defaultFinalColorSettings.outputTransferMode =
FinalColorOutputTransferMode::LinearToSRGB;
assetState->defaultFinalColorSettings.exposureMode =
FinalColorExposureMode::Fixed;
assetState->defaultFinalColorSettings.exposureValue = 1.25f;
assetState->defaultFinalColorSettings.finalColorScale =
XCEngine::Math::Vector4(1.0f, 0.95f, 0.9f, 1.0f);
SceneRenderer renderer(std::make_shared<MockPipelineAsset>(assetState));
const std::vector<CameraRenderRequest> requests =
renderer.BuildRenderRequests(scene, nullptr, CreateValidContext(), RenderSurface(640, 360));
ASSERT_EQ(requests.size(), 1u);
const CameraRenderRequest& request = requests[0];
EXPECT_TRUE(request.finalColorPolicy.hasPipelineDefaults);
EXPECT_TRUE(request.finalColorPolicy.hasCameraOverrides);
EXPECT_FALSE(request.finalColorPolicy.hasVolumeOverrides);
EXPECT_EQ(
request.finalColorPolicy.outputTransferMode,
FinalColorOutputTransferMode::LinearToSRGB);
EXPECT_EQ(
request.finalColorPolicy.exposureMode,
FinalColorExposureMode::Fixed);
EXPECT_FLOAT_EQ(request.finalColorPolicy.exposureValue, 1.8f);
EXPECT_FLOAT_EQ(request.finalColorPolicy.finalColorScale.x, 0.95f);
EXPECT_FALSE(request.finalOutput.IsRequested());
}
TEST(CameraRenderer_Test, UsesResolvedRenderAreaForCameraViewportDimensions) {
Scene scene("CameraRendererViewportRectScene");