diff --git a/package/Shaders/DeferredCompositeCS.hlsl b/package/Shaders/DeferredCompositeCS.hlsl index 31d8967356..028df5a091 100644 --- a/package/Shaders/DeferredCompositeCS.hlsl +++ b/package/Shaders/DeferredCompositeCS.hlsl @@ -188,7 +188,12 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, inout float ao, out float3 il, float3 finalIrradiance = 0; - float directionalAmbientColorSpecular = Color::RGBToLuminance(Color::Ambient(max(0, SharedData::GetAmbient(R)))) * Color::ReflectionNormalisationScale; + float directionalAmbientColorSpecular = + Color::RGBToLuminance( + Color::IrradianceToLinear( + Color::Ambient( + max(0, SharedData::GetAmbient(R))))) * + Color::ReflectionNormalisationScale; # if defined(SKYLIGHTING) # if defined(VR) @@ -206,15 +211,19 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, inout float ao, out float3 il, # if defined(IBL) if (SharedData::iblSettings.EnableIBL) { - float3 envSample = EnvTexture.SampleLevel(LinearSampler, R, level); - float3 fullSample = EnvReflectionsTexture.SampleLevel(LinearSampler, R, level); + float3 envSample = Color::IrradianceToLinear( + EnvTexture.SampleLevel(LinearSampler, R, level)); + float3 fullSample = Color::IrradianceToLinear( + EnvReflectionsTexture.SampleLevel(LinearSampler, R, level)); float3 envSpecular, skySpecular; if (SharedData::iblSettings.DALCMode == 2) { // Mode 2: DALC-normalized env scaled by DALCAmount + sky overlay - float envLum = Color::RGBToLuminance(EnvTexture.SampleLevel(LinearSampler, R, 15)); - envSpecular = Color::IrradianceToLinear((envSample / max(envLum, 0.001)) * directionalAmbientColorSpecular) * SharedData::iblSettings.DALCAmount; - skySpecular = Color::IrradianceToLinear(max(0, fullSample - envSample)) * SharedData::iblSettings.SkyIBLScale; + float envLum = Color::RGBToLuminance( + Color::IrradianceToLinear( + EnvTexture.SampleLevel(LinearSampler, R, 15))); + envSpecular = envSample / max(envLum, 0.001) * directionalAmbientColorSpecular * SharedData::iblSettings.DALCAmount; + skySpecular = max(0, fullSample - envSample) * SharedData::iblSettings.SkyIBLScale; # if defined(SKYLIGHTING) skySpecular *= skylightingSpecular; # elif defined(INTERIOR) @@ -223,8 +232,8 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, inout float ao, out float3 il, } else { // Mode 0/1: IBL ratio-based float3 ratio = ImageBasedLighting::GetIBLRatio(); - envSpecular = Color::IrradianceToLinear(envSample * ratio) * SharedData::iblSettings.EnvIBLScale; - skySpecular = Color::IrradianceToLinear(max(0, fullSample - envSample)) * SharedData::iblSettings.SkyIBLScale; + envSpecular = envSample * ratio * SharedData::iblSettings.EnvIBLScale; + skySpecular = max(0, fullSample - envSample) * SharedData::iblSettings.SkyIBLScale; # if defined(SKYLIGHTING) skySpecular *= skylightingSpecular; # elif defined(INTERIOR) @@ -238,32 +247,40 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, inout float ao, out float3 il, { // Fallback without IBL: normalize-by-luminance with DALC # if defined(INTERIOR) - float3 specularIrradiance = EnvTexture.SampleLevel(LinearSampler, R, level); - float specularIrradianceLuminance = Color::RGBToLuminance(EnvTexture.SampleLevel(LinearSampler, R, 15)); - specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular; - finalIrradiance = Color::IrradianceToLinear(specularIrradiance); + float3 specularIrradiance = Color::IrradianceToLinear( + EnvTexture.SampleLevel(LinearSampler, R, level)); + float specularIrradianceLuminance = Color::RGBToLuminance( + Color::IrradianceToLinear( + EnvTexture.SampleLevel(LinearSampler, R, 15))); + finalIrradiance = specularIrradiance / max(specularIrradianceLuminance, 0.001) * directionalAmbientColorSpecular; # elif defined(SKYLIGHTING) float3 specularIrradianceReflections = 0.0; if (skylightingSpecular > 0.0) { - specularIrradianceReflections = EnvReflectionsTexture.SampleLevel(LinearSampler, R, level); - float lum = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15)); - specularIrradianceReflections = (specularIrradianceReflections / max(lum, 0.001)) * directionalAmbientColorSpecular; - specularIrradianceReflections = Color::IrradianceToLinear(specularIrradianceReflections); + specularIrradianceReflections = Color::IrradianceToLinear( + EnvReflectionsTexture.SampleLevel(LinearSampler, R, level)); + float lum = Color::RGBToLuminance( + Color::IrradianceToLinear( + EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15))); + specularIrradianceReflections = specularIrradianceReflections / max(lum, 0.001) * directionalAmbientColorSpecular; } float3 specularIrradiance = 0.0; if (skylightingSpecular < 1.0) { - specularIrradiance = EnvTexture.SampleLevel(LinearSampler, R, level); - float lum = Color::RGBToLuminance(EnvTexture.SampleLevel(LinearSampler, R, 15)); - float dalcScaled = Color::IrradianceToGamma(Color::IrradianceToLinear(directionalAmbientColorSpecular) * skylightingSpecular); - specularIrradiance = (specularIrradiance / max(lum, 0.001)) * dalcScaled; - specularIrradiance = Color::IrradianceToLinear(specularIrradiance); + specularIrradiance = Color::IrradianceToLinear( + EnvTexture.SampleLevel(LinearSampler, R, level)); + float lum = Color::RGBToLuminance( + Color::IrradianceToLinear( + EnvTexture.SampleLevel(LinearSampler, R, 15))); + float dalcScaled = directionalAmbientColorSpecular * skylightingSpecular; + specularIrradiance = specularIrradiance / max(lum, 0.001) * dalcScaled; } finalIrradiance = lerp(specularIrradiance, specularIrradianceReflections, skylightingSpecular); # else - float3 specularIrradiance = EnvReflectionsTexture.SampleLevel(LinearSampler, R, level); - float specularIrradianceLuminance = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15)); - specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular; - finalIrradiance = Color::IrradianceToLinear(specularIrradiance); + float3 specularIrradiance = Color::IrradianceToLinear( + EnvReflectionsTexture.SampleLevel(LinearSampler, R, level)); + float specularIrradianceLuminance = Color::RGBToLuminance( + Color::IrradianceToLinear( + EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15))); + finalIrradiance = specularIrradiance / max(specularIrradianceLuminance, 0.001) * directionalAmbientColorSpecular; # endif }