summaryrefslogtreecommitdiffstats
path: root/lighting.cginc
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2025-08-07 19:33:02 -0700
committeryum <yum.food.vr@gmail.com>2025-08-07 19:33:02 -0700
commit9393f117a139976b19adf9f5201dfc7023fb3c04 (patch)
treeead7a6a29507ccca4b456a5123742dcc05ccb715 /lighting.cginc
parent8c6e9be61b2a7b1c5b9e5b61252090a4e2432ce2 (diff)
add clearcoat
Diffstat (limited to 'lighting.cginc')
-rw-r--r--lighting.cginc36
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