Lower final color into final output stage

This commit is contained in:
2026-04-06 16:15:19 +08:00
parent 6645d507d0
commit 33bb84f650
17 changed files with 1149 additions and 42 deletions

View File

@@ -35,6 +35,7 @@ constexpr const char* kBuiltinObjectIdShaderPath = "builtin://shaders/object-id"
constexpr const char* kBuiltinSkyboxShaderPath = "builtin://shaders/skybox";
constexpr const char* kBuiltinColorScalePostProcessShaderPath =
"builtin://shaders/color-scale-post-process";
constexpr const char* kBuiltinFinalColorShaderPath = "builtin://shaders/final-color";
constexpr const char* kBuiltinDefaultPrimitiveTexturePath = "builtin://textures/default-primitive-albedo";
constexpr float kPi = 3.14159265358979323846f;
@@ -59,6 +60,8 @@ constexpr const char* kBuiltinSkyboxShaderManifestRelativePath =
"engine/assets/builtin/shaders/skybox/skybox.shader";
constexpr const char* kBuiltinColorScalePostProcessShaderManifestRelativePath =
"engine/assets/builtin/shaders/color-scale-post-process/color-scale-post-process.shader";
constexpr const char* kBuiltinFinalColorShaderManifestRelativePath =
"engine/assets/builtin/shaders/final-color/final-color.shader";
Containers::String NormalizeBuiltinAssetPath(const std::filesystem::path& path) {
return Containers::String(path.lexically_normal().generic_string().c_str());
@@ -143,6 +146,9 @@ const char* GetBuiltinShaderManifestRelativePath(const Containers::String& built
if (builtinShaderPath == Containers::String(kBuiltinColorScalePostProcessShaderPath)) {
return kBuiltinColorScalePostProcessShaderManifestRelativePath;
}
if (builtinShaderPath == Containers::String(kBuiltinFinalColorShaderPath)) {
return kBuiltinFinalColorShaderManifestRelativePath;
}
return nullptr;
}
@@ -691,6 +697,10 @@ Shader* BuildBuiltinColorScalePostProcessShader(const Containers::String& path)
return TryLoadBuiltinShaderFromManifest(path);
}
Shader* BuildBuiltinFinalColorShader(const Containers::String& path) {
return TryLoadBuiltinShaderFromManifest(path);
}
Material* BuildDefaultPrimitiveMaterial(const Containers::String& path) {
auto* material = new Material();
IResource::ConstructParams params;
@@ -817,6 +827,10 @@ Containers::String GetBuiltinColorScalePostProcessShaderPath() {
return Containers::String(kBuiltinColorScalePostProcessShaderPath);
}
Containers::String GetBuiltinFinalColorShaderPath() {
return Containers::String(kBuiltinFinalColorShaderPath);
}
Containers::String GetBuiltinDefaultPrimitiveTexturePath() {
return Containers::String(kBuiltinDefaultPrimitiveTexturePath);
}
@@ -880,10 +894,7 @@ LoadResult CreateBuiltinMeshResource(const Containers::String& path) {
return LoadResult(Containers::String("Unsupported builtin mesh: ") + path);
}
// The UV sphere generator already emits triangles in the runtime's front-face convention.
if (primitiveType != BuiltinPrimitiveType::Sphere) {
FlipTriangleWinding(buffers);
}
FlipTriangleWinding(buffers);
Mesh* mesh = BuildMeshResource(path, GetBuiltinPrimitiveDisplayName(primitiveType), std::move(buffers));
if (mesh == nullptr) {
@@ -922,6 +933,8 @@ LoadResult CreateBuiltinShaderResource(const Containers::String& path) {
shader = BuildBuiltinSkyboxShader(path);
} else if (path == GetBuiltinColorScalePostProcessShaderPath()) {
shader = BuildBuiltinColorScalePostProcessShader(path);
} else if (path == GetBuiltinFinalColorShaderPath()) {
shader = BuildBuiltinFinalColorShader(path);
} else {
return LoadResult(Containers::String("Unknown builtin shader: ") + path);
}