diff options
| author | yum <yum.food.vr@gmail.com> | 2026-03-09 21:07:15 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2026-03-09 21:07:15 -0700 |
| commit | c8cfc043c105a32e1efab341536311277bfc90eb (patch) | |
| tree | 9cc7d41f7db78b165f2051160b82e20500af2148 /lighting.cginc | |
| parent | 439aa46bba1695becd9d42731c29dedc93e05a28 (diff) | |
Fix clearcoat IBL
Diffstat (limited to 'lighting.cginc')
| -rwxr-xr-x | lighting.cginc | 100 |
1 files changed, 29 insertions, 71 deletions
diff --git a/lighting.cginc b/lighting.cginc index 1f3afe6..9ea2052 100755 --- a/lighting.cginc +++ b/lighting.cginc @@ -14,64 +14,6 @@ #include "pbr.cginc" #include "poi.cginc" -struct LightCommon { - float3 V; - float3 N; - float NoV; - float spec_ao; -#if defined(_CLEARCOAT) - float NoV_cc; -#endif -}; - -struct LightDirect { - float3 dir; - - float3 H; - float NoH; - float NoL; -#if defined(_CLEARCOAT) - float NoH_cc; - float NoL_cc; -#endif - float LoH; - float LoV; - float double_LoV; - - float3 color; -}; - -struct LightIndirect { - float3 dir; - - float3 H; - float NoH; - float NoL; -#if defined(_CLEARCOAT) - float LoH_cc; -#endif - float LoH; - float LoV; - float double_LoV; - - float3 specular; -#if defined(_CLEARCOAT) - float3 specular_cc; -#endif - float3 diffuse; - - float3 L00; - float3 L01r; - float3 L01g; - float3 L01b; -}; - -struct LightData { - LightCommon common; - LightDirect direct; - LightIndirect indirect; -}; - float3 getDirectLightDirection(v2f i) { #if defined(POINT) || defined(POINT_COOKIE) || defined(SPOT) return normalize((_WorldSpaceLightPos0 - i.worldPos).xyz); @@ -194,12 +136,6 @@ float4 getIndirectDiffuse(v2f i, Pbr pbr, inout LightData light) { #endif #endif -#if defined(_BRIGHTNESS_CLAMP) && (defined(FORWARD_BASE_PASS) || defined(OUTLINES_PASS)) - float3 diffuse_hsv = RGBtoHSV(diffuse.xyz); - diffuse_hsv.z = clamp(diffuse_hsv.z, _Brightness_Clamp_Min, _Brightness_Clamp_Max); - diffuse.xyz = HSVtoRGB(diffuse_hsv); -#endif - #if defined(_SHADOWS) float3x3 mat = float3x3( light.indirect.L01r, @@ -225,11 +161,15 @@ float4 getIndirectDiffuse(v2f i, Pbr pbr, inout LightData light) { diffuse.xyz *= shadow_color; #endif + return diffuse; +} + +float getAO(v2f i) { + float ao = 1; #if defined(_AMBIENT_OCCLUSION) - diffuse.xyz *= pbr.ao; + ao = saturate(lerp(1.0, _OcclusionMap.Sample(bilinear_repeat_s, i.uv01.xy).r, _OcclusionStrength)); #endif - - return diffuse; + return ao; } float getSpecularAO(v2f i, Pbr pbr, LightData data, float3 reflect_dir) { @@ -237,7 +177,7 @@ float getSpecularAO(v2f i, Pbr pbr, LightData data, float3 reflect_dir) { #if defined(_AMBIENT_OCCLUSION) || defined(_BENT_NORMALS) float ao_vis = 1.0; #if defined(_AMBIENT_OCCLUSION) - ao_vis = pbr.ao; + ao_vis = data.common.ao; #endif #if defined(_BENT_NORMALS) float3 spec_ao_normal = pbr.bent_normal; @@ -262,6 +202,7 @@ float getSpecularAO(v2f i, Pbr pbr, LightData data, float3 reflect_dir) { horizon_fade *= horizon_fade; spec_ao *= horizon_fade; #endif + return spec_ao; } @@ -307,9 +248,10 @@ void GetLighting(v2f i, Pbr pbr, out LightData data) { data.indirect.NoL = saturate(dot(pbr.normal, data.indirect.dir)); data.indirect.NoH = saturate(dot(pbr.normal, data.indirect.H)); #if defined(_CLEARCOAT) - float3 dir_cc = reflect(data.common.V, i.normal); + float3 cc_reflect_dir = reflect(-data.common.V, i.normal); + float3 cc_dominant_dir = getSpecularDominantDirection(i.normal, cc_reflect_dir, pbr.cc_roughness); + float3 dir_cc = normalize(cc_dominant_dir); float3 H_cc = normalize(data.common.V + dir_cc); - data.indirect.LoH_cc = saturate(dot(dir_cc, H_cc)); #endif data.indirect.LoH = saturate(dot(data.indirect.dir, data.indirect.H)); float indirect_LoV = dot(data.indirect.dir, data.common.V); @@ -319,15 +261,31 @@ void GetLighting(v2f i, Pbr pbr, out LightData data) { data.indirect.diffuse = getIndirectDiffuse(i, pbr, data); data.indirect.specular = getIndirectSpecular(i, pbr.roughness_perceptual, view_dir, data.indirect.dir); + data.common.ao = getAO(i); data.common.spec_ao = getSpecularAO(i, pbr, data, reflect_dir); #if defined(_CLEARCOAT) - data.indirect.specular_cc = getIndirectSpecular(i, saturate(sqrt(pbr.cc_roughness)), view_dir, dir_cc); + data.indirect.specular_cc = getIndirectSpecular(i, pbr.cc_roughness_perceptual, view_dir, dir_cc); #if defined(_CLEARCOAT_MASK) float cc_mask = _Clearcoat_Mask.Sample(bilinear_clamp_s, i.uv01.xy).r; data.indirect.specular_cc *= cc_mask; #endif #endif + +#if defined(_BRIGHTNESS_CLAMP) + float3 tmpHSV = RGBtoHSV(data.direct.color); + tmpHSV[2] = clamp(tmpHSV[2], _Brightness_Clamp_Min, _Brightness_Clamp_Max); + data.direct.color = HSVtoRGB(tmpHSV); + + tmpHSV = RGBtoHSV(data.indirect.diffuse); + tmpHSV[2] = clamp(tmpHSV[2], _Brightness_Clamp_Min, _Brightness_Clamp_Max); + data.indirect.diffuse = HSVtoRGB(tmpHSV); + + // No minimum for specular lighting. It would look awful. + tmpHSV = RGBtoHSV(data.indirect.specular); + tmpHSV[2] = clamp(tmpHSV[2], 0, _Brightness_Clamp_Max); + data.indirect.specular = HSVtoRGB(tmpHSV); +#endif } #endif // __LIGHTING_INC |
