From 921990168c22f5cccb77c5b608063d77adeaeab8 Mon Sep 17 00:00:00 2001 From: yum Date: Mon, 16 Mar 2026 14:40:45 -0700 Subject: Fix tessellation shadows, and potential lighting NaNs --- lighting.cginc | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'lighting.cginc') diff --git a/lighting.cginc b/lighting.cginc index cde444a..c8c3f64 100755 --- a/lighting.cginc +++ b/lighting.cginc @@ -205,28 +205,28 @@ void GetLighting(v2f i, Pbr pbr, out LightData data) { data.common.V = -view_dir; data.common.N = pbr.normal; - data.common.NoV = saturate(dot(pbr.normal, data.common.V)); + data.common.NoV = max(1e-4, dot(pbr.normal, data.common.V)); #if defined(_CLEARCOAT) - data.common.NoV_cc = saturate(dot(pbr.cc_normal, data.common.V)); + data.common.NoV_cc = max(1e-4, dot(pbr.cc_normal, data.common.V)); #endif // Direct lighting data.direct.dir = getDirectLightDirection(i); data.direct.H = normalize(data.common.V + data.direct.dir); #if defined(_WRAPPED_LIGHTING) - data.direct.NoL = wrapNoL(saturate(dot(pbr.normal, data.direct.dir)), _Wrapped_Lighting_Amount); + data.direct.NoL = max(1e-4, wrapNoL(saturate(dot(pbr.normal, data.direct.dir)), _Wrapped_Lighting_Amount)); #else - data.direct.NoL = saturate(dot(pbr.normal, data.direct.dir)); + data.direct.NoL = max(1e-4, dot(pbr.normal, data.direct.dir)); #endif - data.direct.NoH = saturate(dot(pbr.normal, data.direct.H)); - data.direct.LoH = saturate(dot(data.direct.dir, data.direct.H)); + data.direct.NoH = max(1e-4, dot(pbr.normal, data.direct.H)); + data.direct.LoH = max(1e-4, dot(data.direct.dir, data.direct.H)); #if defined(_CLEARCOAT) - data.direct.NoH_cc = saturate(dot(pbr.cc_normal, data.direct.H)); - data.direct.NoL_cc = saturate(dot(pbr.cc_normal, data.direct.dir)); + data.direct.NoH_cc = max(1e-4, dot(pbr.cc_normal, data.direct.H)); + data.direct.NoL_cc = max(1e-4, dot(pbr.cc_normal, data.direct.dir)); #endif float direct_LoV = dot(data.direct.dir, data.common.V); - data.direct.LoV = saturate(direct_LoV); - data.direct.double_LoV = saturate(2.0f * direct_LoV * direct_LoV - 1.0f); + data.direct.LoV = max(1e-4, direct_LoV); + data.direct.double_LoV = max(1e-4, 2.0f * direct_LoV * direct_LoV - 1.0f); float4 lightColorIntensity = getDirectLightColorIntensity(); data.direct.color = lightColorIntensity.rgb * getShadowAttenuation(i); @@ -237,18 +237,18 @@ void GetLighting(v2f i, Pbr pbr, out LightData data) { data.indirect.dir = normalize(dominant_dir); data.indirect.H = normalize(data.common.V + data.indirect.dir); - data.indirect.NoL = saturate(dot(pbr.normal, data.indirect.dir)); - data.indirect.NoH = saturate(dot(pbr.normal, data.indirect.H)); + data.indirect.NoL = max(1e-4, dot(pbr.normal, data.indirect.dir)); + data.indirect.NoH = max(1e-4, dot(pbr.normal, data.indirect.H)); #if defined(_CLEARCOAT) float3 cc_reflect_dir = reflect(-data.common.V, pbr.cc_normal); float3 cc_dominant_dir = getSpecularDominantDirection(pbr.cc_normal, cc_reflect_dir, pbr.cc_roughness); float3 dir_cc = normalize(cc_dominant_dir); float3 H_cc = normalize(data.common.V + dir_cc); #endif - data.indirect.LoH = saturate(dot(data.indirect.dir, data.indirect.H)); + data.indirect.LoH = max(1e-4, dot(data.indirect.dir, data.indirect.H)); float indirect_LoV = dot(data.indirect.dir, data.common.V); - data.indirect.LoV = saturate(indirect_LoV); - data.indirect.double_LoV = saturate(2.0f * indirect_LoV * indirect_LoV - 1.0f); + data.indirect.LoV = max(1e-4, indirect_LoV); + data.indirect.double_LoV = max(1e-4, 2.0f * indirect_LoV * indirect_LoV - 1.0f); data.indirect.diffuse = getIndirectDiffuse(i, pbr, data); data.indirect.specular = getIndirectSpecular(i, pbr.roughness_perceptual, view_dir, data.indirect.dir, data.indirect.diffuse); -- cgit v1.2.3