From 54a13b9535d5e96905fbd73e45eeede4721d5486 Mon Sep 17 00:00:00 2001 From: Jiaye Date: Fri, 20 Mar 2026 18:04:49 +0800 Subject: [PATCH] refactor(color): rename gamma conversion functions for clarity --- package/Shaders/Common/Color.hlsli | 54 ++++++------------- package/Shaders/Effect.hlsl | 2 +- ...SCompositeLensFlareVolumetricLighting.hlsl | 2 +- package/Shaders/ISHDR.hlsl | 2 +- package/Shaders/Lighting.hlsl | 24 ++++----- package/Shaders/Tests/TestColor.hlsl | 8 +-- 6 files changed, 35 insertions(+), 57 deletions(-) diff --git a/package/Shaders/Common/Color.hlsli b/package/Shaders/Common/Color.hlsli index b31c1be93d..67f9a2d0c1 100644 --- a/package/Shaders/Common/Color.hlsli +++ b/package/Shaders/Common/Color.hlsli @@ -85,32 +85,32 @@ namespace Color return color; } - float GammaToLinear(float color) + float SkyrimGammaToLinear(float color) { return pow(abs(color), 1.6); } - float LinearToGamma(float color) + float LinearToSkyrimGamma(float color) { return pow(abs(color), 1.0 / 1.6); } - float3 GammaToLinear(float3 color) + float3 SkyrimGammaToLinear(float3 color) { return pow(abs(color), 1.6); } - float3 LinearToGamma(float3 color) + float3 LinearToSkyrimGamma(float3 color) { return pow(abs(color), 1.0 / 1.6); } - float3 GammaToTrueLinear(float3 color) + float3 SrgbToLinear(float3 color) { return pow(abs(color), 2.2); } - float3 TrueLinearToGamma(float3 color) + float3 LinearToSrgb(float3 color) { return pow(abs(color), 1.0 / 2.2); } @@ -124,43 +124,21 @@ namespace Color const static float PBRLightingCompensation = ENABLE_LL ? 1.0 : Math::PI; - float3 GammaToLinearLuminancePreserving(float3 color) - { - if (!ENABLE_LL) { - return color; - } - float originalLuminance = max(RGBToLuminance(color), 1e-5); - float3 linearColorRaw = GammaToLinear(color / originalLuminance); - float scale = GammaToLinear(originalLuminance).x; - return linearColorRaw * scale; - } - - float3 GammaToLinearLuminancePreservingLight(float3 color) - { - if (!ENABLE_LL) { - return color; - } - float originalLuminance = max(RGBToLuminance(color), 1e-5); - float3 linearColorRaw = pow(abs(color / originalLuminance), SharedData::linearLightingSettings.lightGamma); - float scale = originalLuminance; - return linearColorRaw * scale; - } - // Linear Lighting Functions float3 LLGammaToLinear(float3 color) { - return ENABLE_LL ? GammaToLinear(color) : color; + return ENABLE_LL ? SkyrimGammaToLinear(color) : color; } float3 LLLinearToGamma(float3 color) { - return ENABLE_LL ? LinearToGamma(color) : color; + return ENABLE_LL ? LinearToSkyrimGamma(color) : color; } float3 Diffuse(float3 color) { # if defined(TRUE_PBR) - return ENABLE_LL ? color : TrueLinearToGamma(color); + return ENABLE_LL ? color : LinearToSrgb(color); # else return ENABLE_LL ? pow(abs(color), SharedData::linearLightingSettings.colorGamma) * SharedData::linearLightingSettings.vanillaDiffuseColorMult : color; # endif @@ -195,7 +173,7 @@ namespace Color float3 Glowmap(float3 color) { # if defined(TRUE_PBR) - return ENABLE_LL ? color * SharedData::linearLightingSettings.glowmapMult : TrueLinearToGamma(color); + return ENABLE_LL ? color * SharedData::linearLightingSettings.glowmapMult : LinearToSrgb(color); # else return ENABLE_LL ? pow(abs(color), SharedData::linearLightingSettings.glowmapGamma) * SharedData::linearLightingSettings.glowmapMult : color; # endif @@ -271,27 +249,27 @@ namespace Color float3 RadianceToLinear(float3 color) { - return ENABLE_LL ? color : GammaToLinear(color); + return ENABLE_LL ? color : SkyrimGammaToLinear(color); } float IrradianceToLinear(float color) { - return ENABLE_LL ? color : GammaToLinear(color); + return ENABLE_LL ? color : SkyrimGammaToLinear(color); } float IrradianceToGamma(float color) { - return ENABLE_LL ? color : LinearToGamma(color); + return ENABLE_LL ? color : LinearToSkyrimGamma(color); } float3 IrradianceToLinear(float3 color) { - return ENABLE_LL ? color : GammaToLinear(color); + return ENABLE_LL ? color : SkyrimGammaToLinear(color); } float3 IrradianceToGamma(float3 color) { - return ENABLE_LL ? color : LinearToGamma(color); + return ENABLE_LL ? color : LinearToSkyrimGamma(color); } float VanillaNormalization() @@ -311,7 +289,7 @@ namespace Color float3 Diffuse(float3 color) { # if defined(TRUE_PBR) - return TrueLinearToGamma(color); + return LinearToSrgb(color); # else return color; # endif diff --git a/package/Shaders/Effect.hlsl b/package/Shaders/Effect.hlsl index 09a8a5e450..8b1bcd1064 100644 --- a/package/Shaders/Effect.hlsl +++ b/package/Shaders/Effect.hlsl @@ -943,7 +943,7 @@ PS_OUTPUT main(PS_INPUT input) # endif if (!(Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InWorld) && SharedData::linearLightingSettings.enableLinearLighting) { - psout.Diffuse.xyz = Color::TrueLinearToGamma(psout.Diffuse.xyz); + psout.Diffuse.xyz = Color::LinearToSrgb(psout.Diffuse.xyz); } return psout; } diff --git a/package/Shaders/ISCompositeLensFlareVolumetricLighting.hlsl b/package/Shaders/ISCompositeLensFlareVolumetricLighting.hlsl index 29f37eecb1..63682300ae 100644 --- a/package/Shaders/ISCompositeLensFlareVolumetricLighting.hlsl +++ b/package/Shaders/ISCompositeLensFlareVolumetricLighting.hlsl @@ -37,7 +37,7 @@ PS_OUTPUT main(PS_INPUT input) # if defined(LENS_FLARE) float3 lensFlareColor = LFSourceTex.Sample(LFSourceSampler, input.TexCoord).xyz; if (SharedData::linearLightingSettings.enableLinearLighting) { - color += Color::GammaToLinear(lensFlareColor); + color += Color::SkyrimGammaToLinear(lensFlareColor); } else { color += lensFlareColor; } diff --git a/package/Shaders/ISHDR.hlsl b/package/Shaders/ISHDR.hlsl index c187e149f8..93fdb0a18b 100644 --- a/package/Shaders/ISHDR.hlsl +++ b/package/Shaders/ISHDR.hlsl @@ -137,7 +137,7 @@ PS_OUTPUT main(PS_INPUT input) # endif if (SharedData::linearLightingSettings.enableLinearLighting && SharedData::linearLightingSettings.enableGammaCorrection) { - srgbColor = Color::TrueLinearToGamma(srgbColor); + srgbColor = Color::LinearToSrgb(srgbColor); } srgbColor = FrameBuffer::ToSRGBColor(srgbColor); diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 777d0bd0c0..aad23d96c7 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1312,7 +1312,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile0PBR) == 0) { - landColorRGB1 = Color::GammaToTrueLinear(landColorRGB1 / Color::PBRLightingScale); + landColorRGB1 = Color::SrgbToLinear(landColorRGB1 / Color::PBRLightingScale); } # endif float landAlpha1 = landColor1.a; @@ -1393,7 +1393,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile1PBR) == 0) { - landColorRGB2 = Color::GammaToTrueLinear(landColorRGB2 / Color::PBRLightingScale); + landColorRGB2 = Color::SrgbToLinear(landColorRGB2 / Color::PBRLightingScale); } # endif float landAlpha2 = landColor2.a; @@ -1473,7 +1473,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile2PBR) == 0) { - landColorRGB3 = Color::GammaToTrueLinear(landColorRGB3 / Color::PBRLightingScale); + landColorRGB3 = Color::SrgbToLinear(landColorRGB3 / Color::PBRLightingScale); } # endif float landAlpha3 = landColor3.a; @@ -1553,7 +1553,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile3PBR) == 0) { - landColorRGB4 = Color::GammaToTrueLinear(landColorRGB4 / Color::PBRLightingScale); + landColorRGB4 = Color::SrgbToLinear(landColorRGB4 / Color::PBRLightingScale); } # endif float landAlpha4 = landColor4.a; @@ -1633,7 +1633,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile4PBR) == 0) { - landColorRGB5 = Color::GammaToTrueLinear(landColorRGB5 / Color::PBRLightingScale); + landColorRGB5 = Color::SrgbToLinear(landColorRGB5 / Color::PBRLightingScale); } # endif float landAlpha5 = landColor5.a; @@ -1714,7 +1714,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # if defined(TRUE_PBR) [branch] if ((PBRFlags & PBR::TerrainFlags::LandTile5PBR) == 0) { - landColorRGB6 = Color::GammaToTrueLinear(landColorRGB6 / Color::PBRLightingScale); + landColorRGB6 = Color::SrgbToLinear(landColorRGB6 / Color::PBRLightingScale); } # endif float landAlpha6 = landColor6.a; @@ -1864,13 +1864,13 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) if (!SharedData::linearLightingSettings.enableLinearLighting) { baseColor.xyz = GetFacegenBaseColor(baseColor.xyz, uv); } else { - baseColor.xyz = Color::GammaToLinear(GetFacegenBaseColor(Color::LinearToGamma(baseColor.xyz), uv)); + baseColor.xyz = Color::SkyrimGammaToLinear(GetFacegenBaseColor(Color::LinearToSkyrimGamma(baseColor.xyz), uv)); } # elif defined(FACEGEN_RGB_TINT) if (!SharedData::linearLightingSettings.enableLinearLighting) { baseColor.xyz = GetFacegenRGBTintBaseColor(baseColor.xyz, uv); } else { - baseColor.xyz = Color::GammaToLinear(GetFacegenRGBTintBaseColor(Color::LinearToGamma(baseColor.xyz), uv)); + baseColor.xyz = Color::SkyrimGammaToLinear(GetFacegenRGBTintBaseColor(Color::LinearToSkyrimGamma(baseColor.xyz), uv)); } # endif // FACEGEN @@ -2100,7 +2100,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) material.AO = rawRMAOS.z; if (!SharedData::linearLightingSettings.enableLinearLighting) { - material.F0 = lerp(rawRMAOS.w, Color::GammaToTrueLinear(baseColor.xyz), material.Metallic); + material.F0 = lerp(rawRMAOS.w, Color::SrgbToLinear(baseColor.xyz), material.Metallic); } else { material.F0 = lerp(rawRMAOS.w, baseColor.xyz, material.Metallic); } @@ -2252,7 +2252,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) float4 envColorBase = TexEnvSampler.SampleLevel(SampEnvSampler, float3(1.0, 0.0, 0.0), 15); if (envColorBase.a < 1.0) { - material.F0 = Color::GammaToLinear(envColorBase.rgb); + material.F0 = Color::SkyrimGammaToLinear(envColorBase.rgb); material.Roughness = envColorBase.a; } else { material.F0 = 1.0; @@ -2276,7 +2276,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # endif if (!dynamicCubemap) { - float3 envColorBase = Color::GammaToLinear(TexEnvSampler.Sample(SampEnvSampler, envSamplingPoint).xyz); + float3 envColorBase = Color::SkyrimGammaToLinear(TexEnvSampler.Sample(SampEnvSampler, envSamplingPoint).xyz); envColor = envColorBase.xyz * envMask; } } @@ -3190,7 +3190,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) # endif if ((!inWorld && !inReflection) && SharedData::linearLightingSettings.enableLinearLighting && !(Permutation::PixelShaderDescriptor & Permutation::LightingFlags::DefShadow)) { - psout.Diffuse.xyz = Color::TrueLinearToGamma(psout.Diffuse.xyz); + psout.Diffuse.xyz = Color::LinearToSrgb(psout.Diffuse.xyz); } return psout; diff --git a/package/Shaders/Tests/TestColor.hlsl b/package/Shaders/Tests/TestColor.hlsl index 9818f7376e..7257860015 100644 --- a/package/Shaders/Tests/TestColor.hlsl +++ b/package/Shaders/Tests/TestColor.hlsl @@ -101,16 +101,16 @@ float3 original = testColors[i]; // Test Gamma -> Linear -> Gamma - float3 linearColor = Color::GammaToLinear(original); - float3 backToGamma = Color::LinearToGamma(linearColor); + float3 linearColor = Color::SkyrimGammaToLinear(original); + float3 backToGamma = Color::LinearToSkyrimGamma(linearColor); ASSERT(IsTrue, abs(backToGamma.r - original.r) < 0.01f); ASSERT(IsTrue, abs(backToGamma.g - original.g) < 0.01f); ASSERT(IsTrue, abs(backToGamma.b - original.b) < 0.01f); // Test TrueLinear roundtrip - float3 trueLinearColor = Color::GammaToTrueLinear(original); - float3 backToGamma2 = Color::TrueLinearToGamma(trueLinearColor); + float3 trueLinearColor = Color::SrgbToLinear(original); + float3 backToGamma2 = Color::LinearToSrgb(trueLinearColor); ASSERT(IsTrue, abs(backToGamma2.r - original.r) < 0.01f); ASSERT(IsTrue, abs(backToGamma2.g - original.g) < 0.01f);