From 9d7fdab193feab5f491d6ff7b474f4fed16f5b91 Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Sun, 23 Mar 2025 20:53:32 -0500 Subject: [PATCH] correct further flaws with albedo handling --- .../core/rendering/shaders/gl/lighting.glsl | 12 ++++++----- .../game/core/rendering/shaders/lighting.hlsl | 20 ++++++++++++++----- .../advanced/gl/reflectionProbeArrayP.glsl | 5 +++-- .../advanced/reflectionProbeArrayP.hlsl | 13 ++++++++---- 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl b/Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl index a4775b919..315e3434c 100644 --- a/Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl +++ b/Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl @@ -227,6 +227,7 @@ vec3 evaluateStandardBRDF(Surface surface, SurfaceToLight surfaceToLight) { // Compute Fresnel term vec3 F = F_Schlick(surface.f0, surfaceToLight.HdotV); + F += lerp(vec3(0.04f,0.04f,0.04f), surface.baseColor.rgb, surface.metalness); // GGX Normal Distribution Function float D = D_GGX(surfaceToLight.NdotH, surface.linearRoughness); @@ -583,12 +584,13 @@ vec4 computeForwardProbes(Surface surface, } vec2 envBRDF = textureLod(BRDFTexture, vec2(surface.NdotV, surface.roughness),0).rg; - vec3 diffuse = irradiance * surface.baseColor.rgb * (1.0 - surface.metalness); - vec3 specularCol = specular * lerp(envBRDF.y, envBRDF.x, surface.metalness * (1.0 - surface.roughness)); + vec3 diffuse = irradiance * lerp(surface.baseColor.rgb, vec3(0.04f,0.04f,0.04f), surface.metalness); + vec3 specularCol = ((specular + surface.baseColor.rgb) * envBRDF.x + envBRDF.y)*surface.metalness; // Final color output after environment lighting vec3 finalColor = diffuse + specularCol; finalColor *= surface.ao; + if(isCapturing == 1) return vec4(lerp((finalColor), surface.baseColor.rgb,surface.metalness),0); else @@ -735,13 +737,13 @@ vec4 debugVizForwardProbes(Surface surface, } vec2 envBRDF = textureLod(BRDFTexture, vec2(surface.NdotV, surface.roughness),0).rg; - vec3 diffuse = irradiance * surface.baseColor.rgb * (1.0 - surface.metalness); - vec3 specularCol = specular * lerp(envBRDF.y, envBRDF.x, surface.metalness * (1.0 - surface.roughness)); + vec3 diffuse = irradiance * lerp(surface.baseColor.rgb, vec3(0.04f,0.04f,0.04f), surface.metalness); + vec3 specularCol = ((specular + surface.baseColor.rgb) * envBRDF.x + envBRDF.y)*surface.metalness; - specularCol *= surface.metalness + (1.0 - surface.roughness); // Final color output after environment lighting vec3 finalColor = diffuse + specularCol; finalColor *= surface.ao; + if(isCapturing == 1) return vec4(lerp((finalColor), surface.baseColor.rgb,surface.metalness),0); else diff --git a/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl b/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl index 2d1c7a983..c125fe9e6 100644 --- a/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl +++ b/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl @@ -228,6 +228,7 @@ float3 evaluateStandardBRDF(Surface surface, SurfaceToLight surfaceToLight) { // Compute Fresnel term float3 F = F_Schlick(surface.f0, surfaceToLight.HdotV); + F += lerp(0.04f, surface.baseColor.rgb, surface.metalness); // GGX Normal Distribution Function float D = D_GGX(surfaceToLight.NdotH, surface.linearRoughness); @@ -589,12 +590,17 @@ float4 computeForwardProbes(Surface surface, } float2 envBRDF = TORQUE_TEX2DLOD(BRDFTexture, float4(surface.NdotV, surface.roughness,0,0)).rg; - float3 diffuse = irradiance * surface.baseColor.rgb * (1.0 - surface.metalness); - float3 specularCol = specular * lerp(envBRDF.y, envBRDF.x, surface.metalness * (1.0 - surface.roughness)); + float3 diffuse = irradiance * lerp(surface.baseColor.rgb, 0.04f, surface.metalness); + float3 specularCol = ((specular + surface.baseColor.rgb) * envBRDF.x + envBRDF.y)*surface.metalness; + + float horizonOcclusion = 1.3; + float horizon = saturate( 1 + horizonOcclusion * dot(surface.R, surface.N)); + horizon *= horizon; // Final color output after environment lighting float3 finalColor = diffuse + specularCol; finalColor *= surface.ao; + if(isCapturing == 1) return float4(lerp((finalColor), surface.baseColor.rgb,surface.metalness),0); else @@ -741,13 +747,17 @@ float4 debugVizForwardProbes(Surface surface, } float2 envBRDF = TORQUE_TEX2DLOD(BRDFTexture, float4(surface.NdotV, surface.roughness,0,0)).rg; - float3 diffuse = irradiance * surface.baseColor.rgb * (1.0 - surface.metalness); - float3 specularCol = specular * lerp(envBRDF.y, envBRDF.x, surface.metalness * (1.0 - surface.roughness)); + float3 diffuse = irradiance * lerp(surface.baseColor.rgb, 0.04f, surface.metalness); + float3 specularCol = ((specular + surface.baseColor.rgb) * envBRDF.x + envBRDF.y)*surface.metalness; + + float horizonOcclusion = 1.3; + float horizon = saturate( 1 + horizonOcclusion * dot(surface.R, surface.N)); + horizon *= horizon; - specularCol *= surface.metalness + (1.0 - surface.roughness); // Final color output after environment lighting float3 finalColor = diffuse + specularCol; finalColor *= surface.ao; + if(isCapturing == 1) return float4(lerp((finalColor), surface.baseColor.rgb,surface.metalness),0); else diff --git a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl index 4860be006..7a6869352 100644 --- a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl +++ b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl @@ -205,12 +205,13 @@ void main() #endif vec2 envBRDF = textureLod(BRDFTexture, vec2(surface.NdotV, surface.roughness),0).rg; - vec3 diffuse = irradiance * surface.baseColor.rgb * (1.0 - surface.metalness); - vec3 specularCol = specular * lerp(envBRDF.y, envBRDF.x, surface.metalness * (1.0 - surface.roughness)); + vec3 diffuse = irradiance * lerp(surface.baseColor.rgb, vec3(0.04f,0.04f,0.04f), surface.metalness); + vec3 specularCol = ((specular + surface.baseColor.rgb) * envBRDF.x + envBRDF.y)*surface.metalness; // Final color output after environment lighting vec3 finalColor = diffuse + specularCol; finalColor *= surface.ao; + if(isCapturing == 1) OUT_col = vec4(lerp((finalColor), surface.baseColor.rgb,surface.metalness),0); else diff --git a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl index 8785ada1d..258b0bd78 100644 --- a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl +++ b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl @@ -187,18 +187,23 @@ float4 main(PFXVertToPix IN) : SV_TARGET } #if DEBUGVIZ_SPECCUBEMAP == 1 && DEBUGVIZ_DIFFCUBEMAP == 0 - return float4(specular, 1); + return float4(specular, 1); #elif DEBUGVIZ_DIFFCUBEMAP == 1 return float4(irradiance, 1); #endif float2 envBRDF = TORQUE_TEX2DLOD(BRDFTexture, float4(surface.NdotV, surface.roughness,0,0)).rg; - float3 diffuse = irradiance * surface.baseColor.rgb * (1.0 - surface.metalness); - float3 specularCol = specular * lerp(envBRDF.y, envBRDF.x, surface.metalness * (1.0 - surface.roughness)); + float3 diffuse = irradiance * lerp(surface.baseColor.rgb, 0.04f, surface.metalness); + float3 specularCol = ((specular + surface.baseColor.rgb) * envBRDF.x + envBRDF.y)*surface.metalness; + float horizonOcclusion = 1.3; + float horizon = saturate( 1 + horizonOcclusion * dot(surface.R, surface.N)); + horizon *= horizon; + // Final color output after environment lighting float3 finalColor = diffuse + specularCol; - finalColor *= surface.ao; + finalColor *= surface.ao; + if(isCapturing == 1) return float4(lerp(finalColor, surface.baseColor.rgb,surface.metalness),0); else