diff options
| author | yum <yum.food.vr@gmail.com> | 2025-08-07 19:33:02 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2025-08-07 19:33:02 -0700 |
| commit | 9393f117a139976b19adf9f5201dfc7023fb3c04 (patch) | |
| tree | ead7a6a29507ccca4b456a5123742dcc05ccb715 /lighting.cginc | |
| parent | 8c6e9be61b2a7b1c5b9e5b61252090a4e2432ce2 (diff) | |
add clearcoat
Diffstat (limited to 'lighting.cginc')
| -rw-r--r-- | lighting.cginc | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/lighting.cginc b/lighting.cginc index db3c4ff..66b7220 100644 --- a/lighting.cginc +++ b/lighting.cginc @@ -16,7 +16,10 @@ struct LightCommon { float3 V; float3 N; - float NoV; + float NoV; +#if defined(_CLEARCOAT) + float NoV_cc; +#endif }; struct LightDirect { @@ -25,6 +28,10 @@ struct LightDirect { float3 H; float NoH; float NoL; +#if defined(_CLEARCOAT) + float NoH_cc; + float NoL_cc; +#endif float LoH; float LoV; float double_LoV; @@ -38,11 +45,17 @@ struct LightIndirect { 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; @@ -78,9 +91,9 @@ float4 getDirectLightColorIntensity() { return float4(_LightColor0.xyz / _LightColor0.w, _LightColor0.w); } -float3 getIndirectSpecular(v2f i, Pbr pbr, float3 view_dir, float3 reflect_dir) { +float3 getIndirectSpecular(v2f i, float roughness, float3 view_dir, float3 reflect_dir) { UnityGIInput data = InitialiseUnityGIInput(i.worldPos, view_dir); - float3 env_refl = UnityGI_prefilteredRadiance(data, pbr.roughness_perceptual, reflect_dir); + float3 env_refl = UnityGI_prefilteredRadiance(data, roughness, reflect_dir); return env_refl; } @@ -108,6 +121,9 @@ 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)); +#if defined(_CLEARCOAT) + data.common.NoV_cc = saturate(dot(i.normal, data.common.V)); +#endif // Direct lighting data.direct.dir = getDirectLightDirection(i); @@ -115,6 +131,10 @@ void GetLighting(v2f i, Pbr pbr, out LightData data) { data.direct.NoL = saturate(dot(pbr.normal, data.direct.dir)); data.direct.NoH = saturate(dot(pbr.normal, data.direct.H)); data.direct.LoH = saturate(dot(data.direct.dir, data.direct.H)); +#if defined(_CLEARCOAT) + data.direct.NoH_cc = saturate(dot(i.normal, data.direct.H)); + data.direct.NoL_cc = saturate(dot(i.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); @@ -127,13 +147,21 @@ void GetLighting(v2f i, Pbr pbr, out LightData data) { 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)); +#if defined(_CLEARCOAT) + float3 dir_cc = -reflect(data.common.V, i.normal); + 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.direct.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.diffuse = getIndirectDiffuse(i, pbr, data.indirect); - data.indirect.specular = getIndirectSpecular(i, pbr, view_dir, data.indirect.dir); + data.indirect.specular = getIndirectSpecular(i, pbr.roughness_perceptual, view_dir, data.indirect.dir); +#if defined(_CLEARCOAT) + data.indirect.specular_cc = getIndirectSpecular(i, pbr.cc_roughness, view_dir, dir_cc); +#endif } #endif // __LIGHTING_INC |
