Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 16 additions & 38 deletions package/Shaders/Common/Color.hlsli
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand All @@ -311,7 +289,7 @@ namespace Color
float3 Diffuse(float3 color)
{
# if defined(TRUE_PBR)
return TrueLinearToGamma(color);
return LinearToSrgb(color);
# else
return color;
# endif
Expand Down
2 changes: 1 addition & 1 deletion package/Shaders/Effect.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
2 changes: 1 addition & 1 deletion package/Shaders/ISHDR.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
24 changes: 12 additions & 12 deletions package/Shaders/Lighting.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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;
Expand All @@ -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;
}
}
Expand Down Expand Up @@ -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;
Expand Down
8 changes: 4 additions & 4 deletions package/Shaders/Tests/TestColor.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Loading