diff --git a/features/Dynamic Cubemaps/Shaders/DynamicCubemaps/DynamicCubemaps.hlsli b/features/Dynamic Cubemaps/Shaders/DynamicCubemaps/DynamicCubemaps.hlsli index fcc779d4d3..2028a0085f 100644 --- a/features/Dynamic Cubemaps/Shaders/DynamicCubemaps/DynamicCubemaps.hlsli +++ b/features/Dynamic Cubemaps/Shaders/DynamicCubemaps/DynamicCubemaps.hlsli @@ -10,8 +10,8 @@ namespace DynamicCubemaps { - TextureCube EnvReflectionsTexture : register(t30); - TextureCube EnvTexture : register(t31); + TextureCube EnvReflectionsTexture : register(t30); + TextureCube EnvTexture : register(t31); #if !defined(WATER) @@ -22,9 +22,6 @@ namespace DynamicCubemaps # endif { float3 R = reflect(-V, N); - float NoV = saturate(dot(N, V)); - - float level = roughness * 7.0; // Horizon specular occlusion // https://marmosetco.tumblr.com/post/81245981087 @@ -35,68 +32,81 @@ namespace DynamicCubemaps return horizon; # else + float NoV = saturate(dot(N, V)); + + float level = roughness * 7.0; + float3 finalIrradiance = 0; - float directionalAmbientColorSpecular = Color::RGBToLuminance(max(0, mul(SharedData::DirectionalAmbient, float4(R, 1.0))) * Color::ReflectionNormalisationScale); + float directionalAmbientColorSpecular = Color::RGBToLuminance( + max(0, mul(SharedData::DirectionalAmbient, float4(R, 1.0))) + ) * Color::ReflectionNormalisationScale; # if defined(IBL) && defined(LIGHTING) const bool inWorld = (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InWorld); const bool inReflection = (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InReflection); if (SharedData::iblSettings.EnableDiffuseIBL && SharedData::iblSettings.UseStaticIBL && !inWorld && !inReflection) { float3 specularIrradiance = ImageBasedLighting::StaticSpecularIBLTexture.SampleLevel(SampColorSampler, R.xzy, level).xyz; - finalIrradiance += specularIrradiance; + finalIrradiance = specularIrradiance; return finalIrradiance; } # endif # if defined(SKYLIGHTING) if (SharedData::InInterior) { - float3 specularIrradiance = Color::GammaToLinear(EnvTexture.SampleLevel(SampColorSampler, R, level).xyz); + float3 specularIrradiance = EnvTexture.SampleLevel(SampColorSampler, R, level).xyz; - float specularIrradianceLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvTexture.SampleLevel(SampColorSampler, R, 15).xyz)); + float specularIrradianceLuminance = Color::RGBToLuminance(EnvTexture.SampleLevel(SampColorSampler, R, 15)); specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular; + specularIrradiance = Color::GammaToLinear(specularIrradiance); - finalIrradiance += specularIrradiance; + finalIrradiance = specularIrradiance; return finalIrradiance; } sh2 specularLobe = SphericalHarmonics::FauxSpecularLobe(N, -V, roughness); float skylightingSpecular = SphericalHarmonics::FuncProductIntegral(skylighting, specularLobe); + skylightingSpecular = saturate(skylightingSpecular); skylightingSpecular = Skylighting::mixSpecular(SharedData::skylightingSettings, skylightingSpecular); - directionalAmbientColorSpecular *= skylightingSpecular; - - float3 specularIrradiance = 1; + float3 specularIrradianceReflections = 0.0; - if (skylightingSpecular < 1.0){ - specularIrradiance = Color::GammaToLinear(EnvTexture.SampleLevel(SampColorSampler, R, level).xyz); + if (skylightingSpecular > 0.0){ + specularIrradianceReflections = EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level); - float specularIrradianceLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvTexture.SampleLevel(SampColorSampler, R, 15).xyz)); + float specularIrradianceReflectionsLuminance = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, 15)); - specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular; + specularIrradianceReflections = (specularIrradianceReflections / max(specularIrradianceReflectionsLuminance, 0.001)) * directionalAmbientColorSpecular; + specularIrradianceReflections = Color::GammaToLinear(specularIrradianceReflections); } - float3 specularIrradianceReflections = 1.0; + float3 specularIrradiance = 0.0; - if (skylightingSpecular > 0.0){ - specularIrradianceReflections = Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level).xyz); + if (skylightingSpecular < 1.0){ + specularIrradiance = EnvTexture.SampleLevel(SampColorSampler, R, level); - float specularIrradianceReflectionsLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, 15).xyz)); + float specularIrradianceLuminance = Color::RGBToLuminance(EnvTexture.SampleLevel(SampColorSampler, R, 15)); - specularIrradianceReflections = (specularIrradianceReflections / max(specularIrradianceReflectionsLuminance, 0.001)) * directionalAmbientColorSpecular; + directionalAmbientColorSpecular = Color::GammaToLinear(directionalAmbientColorSpecular); + directionalAmbientColorSpecular *= skylightingSpecular; + directionalAmbientColorSpecular = Color::LinearToGamma(directionalAmbientColorSpecular); + + specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular; + specularIrradiance = Color::GammaToLinear(specularIrradiance); } finalIrradiance = lerp(specularIrradiance, specularIrradianceReflections, skylightingSpecular); # else - float3 specularIrradiance = Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level).xyz); + float3 specularIrradiance = EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level); - float specularIrradianceLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvTexture.SampleLevel(SampColorSampler, R, 15).xyz)); + float specularIrradianceLuminance = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, 15)); specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular; + specularIrradiance = Color::GammaToLinear(specularIrradiance); - finalIrradiance += specularIrradiance; + finalIrradiance = specularIrradiance; # endif return finalIrradiance; # endif @@ -125,6 +135,7 @@ namespace DynamicCubemaps # else float3 finalIrradiance = 0; + float directionalAmbientColorSpecular = Color::RGBToLuminance(max(0, mul(SharedData::DirectionalAmbient, float4(R, 1.0)))) * Color::ReflectionNormalisationScale; # if defined(IBL) && defined(LIGHTING) const bool inWorld = (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InWorld); @@ -138,33 +149,57 @@ namespace DynamicCubemaps # if defined(SKYLIGHTING) if (SharedData::InInterior) { - float3 specularIrradiance = Color::GammaToLinear(EnvTexture.SampleLevel(SampColorSampler, R, level).xyz); + float3 specularIrradiance = EnvTexture.SampleLevel(SampColorSampler, R, level).xyz; - finalIrradiance += specularIrradiance; + float specularIrradianceLuminance = Color::RGBToLuminance(EnvTexture.SampleLevel(SampColorSampler, R, 15)); + specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular; + specularIrradiance = Color::GammaToLinear(specularIrradiance); + + finalIrradiance = specularIrradiance; return horizon * (F0 * specularBRDF.x + specularBRDF.y) * finalIrradiance; } sh2 specularLobe = SphericalHarmonics::FauxSpecularLobe(N, -V, roughness); float skylightingSpecular = SphericalHarmonics::FuncProductIntegral(skylighting, specularLobe); + skylightingSpecular = saturate(skylightingSpecular); skylightingSpecular = Skylighting::mixSpecular(SharedData::skylightingSettings, skylightingSpecular); - float3 specularIrradiance = 1; + directionalAmbientColorSpecular *= skylightingSpecular; + + float3 specularIrradiance = 1.0; + + if (skylightingSpecular < 1.0){ + specularIrradiance = EnvTexture.SampleLevel(SampColorSampler, R, level); - if (skylightingSpecular < 1.0) - specularIrradiance = Color::GammaToLinear(EnvTexture.SampleLevel(SampColorSampler, R, level).xyz); + float specularIrradianceLuminance = Color::RGBToLuminance(EnvTexture.SampleLevel(SampColorSampler, R, 15)); + + specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular; + specularIrradiance = Color::GammaToLinear(specularIrradiance); + } float3 specularIrradianceReflections = 1.0; - if (skylightingSpecular > 0.0) - specularIrradianceReflections = Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level).xyz); + if (skylightingSpecular > 0.0){ + specularIrradianceReflections = EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level); + + float specularIrradianceReflectionsLuminance = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, 15)); + + specularIrradianceReflections = (specularIrradianceReflections / max(specularIrradianceReflectionsLuminance, 0.001)) * directionalAmbientColorSpecular; + specularIrradianceReflections = Color::GammaToLinear(specularIrradianceReflections); + } finalIrradiance = lerp(specularIrradiance, specularIrradianceReflections, skylightingSpecular); # else - float3 specularIrradiance = Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level)); + float3 specularIrradiance = EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level); + + float specularIrradianceLuminance = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, 15)); + + specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular; + specularIrradiance = Color::GammaToLinear(specularIrradiance); - finalIrradiance += specularIrradiance; + finalIrradiance = specularIrradiance; # endif return horizon * (F0 * specularBRDF.x + specularBRDF.y) * finalIrradiance; # endif diff --git a/features/Dynamic Cubemaps/Shaders/Features/DynamicCubemaps.ini b/features/Dynamic Cubemaps/Shaders/Features/DynamicCubemaps.ini index d74feebe30..71d4a35bea 100644 --- a/features/Dynamic Cubemaps/Shaders/Features/DynamicCubemaps.ini +++ b/features/Dynamic Cubemaps/Shaders/Features/DynamicCubemaps.ini @@ -1,2 +1,2 @@ [Info] -Version = 2-2-1 \ No newline at end of file +Version = 2-2-2 \ No newline at end of file diff --git a/package/Shaders/Common/Color.hlsli b/package/Shaders/Common/Color.hlsli index 6b74bb92ee..c7770044fc 100644 --- a/package/Shaders/Common/Color.hlsli +++ b/package/Shaders/Common/Color.hlsli @@ -66,10 +66,20 @@ namespace Color } // Attempt to match vanilla materials that are darker than PBR - const static float PBRLightingScale = 0.666; + const static float PBRLightingScale = 0.65; // Attempt to normalise reflection brightness against DALC - const static float ReflectionNormalisationScale = 0.666; + const static float ReflectionNormalisationScale = 0.65; + + float GammaToLinear(float color) + { + return pow(abs(color), 1.6); + } + + float LinearToGamma(float color) + { + return pow(abs(color), 1.0 / 1.6); + } float3 GammaToLinear(float3 color) { diff --git a/package/Shaders/DeferredCompositeCS.hlsl b/package/Shaders/DeferredCompositeCS.hlsl index 7fdd87927f..215696be8b 100644 --- a/package/Shaders/DeferredCompositeCS.hlsl +++ b/package/Shaders/DeferredCompositeCS.hlsl @@ -188,27 +188,25 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, out float ao, out float3 il, i float3 finalIrradiance = 0; - float directionalAmbientColorSpecular = Color::RGBToLuminance( - Color::GammaToLinear(max(0, mul(SharedData::DirectionalAmbient, float4(R, 1.0)))) - * Color::ReflectionNormalisationScale - ); + float directionalAmbientColorSpecular = Color::RGBToLuminance(max(0, mul(SharedData::DirectionalAmbient, float4(R, 1.0)))) * Color::ReflectionNormalisationScale; + # if defined(INTERIOR) - float3 specularIrradiance = Color::GammaToLinear(EnvTexture.SampleLevel(LinearSampler, R, level)); + float3 specularIrradiance = EnvTexture.SampleLevel(LinearSampler, R, level); - float specularIrradianceLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvTexture.SampleLevel(LinearSampler, R, 15))); + float specularIrradianceLuminance = Color::RGBToLuminance(EnvTexture.SampleLevel(LinearSampler, R, 15)); # if defined(IBL) float3 iblColor = 0; if (SharedData::iblSettings.EnableDiffuseIBL && SharedData::iblSettings.EnableInterior) { directionalAmbientColorSpecular *= SharedData::iblSettings.DALCAmount; iblColor += Color::Saturation(ImageBasedLighting::GetIBLColor(-R), SharedData::iblSettings.IBLSaturation) * SharedData::iblSettings.DiffuseIBLScale; - float iblColorLuminance = Color::RGBToLuminance(iblColor); + float iblColorLuminance = Color::RGBToLuminance(Color::LinearToGamma(iblColor)); directionalAmbientColorSpecular += iblColorLuminance; } # endif specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular; - finalIrradiance += specularIrradiance; + finalIrradiance = Color::GammaToLinear(specularIrradiance); # elif defined(SKYLIGHTING) # if defined(VR) float3 positionMS = positionWS.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[0].xyz; @@ -219,37 +217,46 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, out float ao, out float3 il, i sh2 skylighting = Skylighting::sample(SharedData::skylightingSettings, SkylightingProbeArray, stbn_vec3_2Dx1D_128x128x64, dispatchID.xy, positionMS.xyz, R); float skylightingSpecular = SphericalHarmonics::FuncProductIntegral(skylighting, specularLobe); + skylightingSpecular = saturate(skylightingSpecular); skylightingSpecular = Skylighting::mixSpecular(SharedData::skylightingSettings, skylightingSpecular); - directionalAmbientColorSpecular *= skylightingSpecular; # if defined(IBL) float3 iblColor = 0; if (SharedData::iblSettings.EnableDiffuseIBL) { directionalAmbientColorSpecular *= SharedData::iblSettings.DALCAmount; iblColor += Color::Saturation(ImageBasedLighting::GetIBLColor(-R, skylightingSpecular), SharedData::iblSettings.IBLSaturation) * SharedData::iblSettings.DiffuseIBLScale; - float iblColorLuminance = Color::RGBToLuminance(iblColor); + float iblColorLuminance = Color::RGBToLuminance(Color::LinearToGamma(iblColor)); directionalAmbientColorSpecular += iblColorLuminance; } # endif - float3 specularIrradiance = 1; + float3 specularIrradianceReflections = 0.0; - if (skylightingSpecular < 1.0){ - specularIrradiance = Color::GammaToLinear(EnvTexture.SampleLevel(LinearSampler, R, level)); + if (skylightingSpecular > 0.0){ + specularIrradianceReflections = EnvReflectionsTexture.SampleLevel(LinearSampler, R, level); - float specularIrradianceLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvTexture.SampleLevel(LinearSampler, R, 15))); + float specularIrradianceLuminance = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15)); + + specularIrradianceReflections = (specularIrradianceReflections / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular; + + specularIrradianceReflections = Color::GammaToLinear(specularIrradianceReflections); - specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular; } - float3 specularIrradianceReflections = 1.0; + float3 specularIrradiance = 0.0; - if (skylightingSpecular > 0.0){ - specularIrradianceReflections = Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(LinearSampler, R, level)); + if (skylightingSpecular < 1.0){ + specularIrradiance = EnvTexture.SampleLevel(LinearSampler, R, level); - float specularIrradianceLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15))); + float specularIrradianceLuminance = Color::RGBToLuminance(EnvTexture.SampleLevel(LinearSampler, R, 15)); - specularIrradianceReflections = (specularIrradianceReflections / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular; + directionalAmbientColorSpecular = Color::GammaToLinear(directionalAmbientColorSpecular); + directionalAmbientColorSpecular *= skylightingSpecular; + directionalAmbientColorSpecular = Color::LinearToGamma(directionalAmbientColorSpecular); + + specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular; + + specularIrradiance = Color::GammaToLinear(specularIrradiance); } finalIrradiance = lerp(specularIrradiance, specularIrradianceReflections, skylightingSpecular); @@ -259,17 +266,17 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, out float ao, out float3 il, i if (SharedData::iblSettings.EnableDiffuseIBL) { directionalAmbientColorSpecular *= SharedData::iblSettings.DALCAmount; iblColor += Color::Saturation(ImageBasedLighting::GetIBLColor(-R), SharedData::iblSettings.IBLSaturation) * SharedData::iblSettings.DiffuseIBLScale; - float iblColorLuminance = Color::RGBToLuminance(iblColor); + float iblColorLuminance = Color::RGBToLuminance(Color::LinearToGamma(iblColor)); directionalAmbientColorSpecular += iblColorLuminance; } # endif - float3 specularIrradianceReflections = Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(LinearSampler, R, level)); + float3 specularIrradianceReflections = EnvReflectionsTexture.SampleLevel(LinearSampler, R, level); - float specularIrradianceReflectionsLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15))); + float specularIrradianceReflectionsLuminance = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15)); specularIrradianceReflections = (specularIrradianceReflections / max(specularIrradianceReflectionsLuminance, 0.001)) * directionalAmbientColorSpecular; - finalIrradiance += specularIrradianceReflections; + finalIrradiance = Color::GammaToLinear(specularIrradianceReflections); # endif # if defined(SSGI)