summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2026-03-11 17:54:36 -0700
committeryum <yum.food.vr@gmail.com>2026-03-11 17:54:36 -0700
commit51e625816b01773577a5f54b7504548ce1af9acd (patch)
treecfbe85e8b2af547cdbf7c6592d5d74d841b1b609
parentc36b919595874355c511b2c75ba9797440be09a5 (diff)
Add normal map to clearcoat
-rwxr-xr-x3ner.shader8
-rw-r--r--data.cginc1
-rwxr-xr-xfeatures.cginc4
-rwxr-xr-xglobals.cginc6
-rwxr-xr-xlighting.cginc10
-rwxr-xr-xpbr.cginc11
6 files changed, 34 insertions, 6 deletions
diff --git a/3ner.shader b/3ner.shader
index 68b947b..f5a9221 100755
--- a/3ner.shader
+++ b/3ner.shader
@@ -615,6 +615,14 @@ Shader "yum_food/3ner"
_Clearcoat_Strength("Strength", Range(0, 1)) = 0
_Clearcoat_Roughness("Roughness", Range(0, 1)) = 0
+ //ifex _Clearcoat_Normals_Enabled==0
+ [HideInInspector] m_start_Clearcoat_Normals("Clearcoat Normals", Float) = 0
+ [ThryToggle(_CLEARCOAT_NORMALS)] _Clearcoat_Normals_Enabled("Enable", Float) = 0
+ [Normal] _Clearcoat_Normals("Normal Map", 2D) = "bump" {}
+ _Clearcoat_Normals_Strength("Strength", Range(0, 10)) = 1
+ [HideInInspector] m_end_Clearcoat_Normals("Clearcoat Normals", Float) = 0
+ //endex
+
//ifex _Clearcoat_Mask_Enabled==0
[HideInInspector] m_start_Clearcoat_Mask("Clearcoat Mask", Float) = 0
[ThryToggle(_CLEARCOAT_MASK)] _Clearcoat_Mask_Enabled("Enable", Float) = 0
diff --git a/data.cginc b/data.cginc
index e0fcd77..48087df 100644
--- a/data.cginc
+++ b/data.cginc
@@ -24,6 +24,7 @@ struct Pbr {
float3 bent_normal;
#endif
#if defined(_CLEARCOAT)
+ float3 cc_normal;
float cc_roughness;
float cc_roughness_perceptual;
float cc_strength;
diff --git a/features.cginc b/features.cginc
index 5353060..5938c60 100755
--- a/features.cginc
+++ b/features.cginc
@@ -48,6 +48,10 @@
#pragma shader_feature_local _CLEARCOAT
//endex
+//ifex _Clearcoat_Normals_Enabled==0
+#pragma shader_feature_local _CLEARCOAT_NORMALS
+//endex
+
//ifex _Clearcoat_Mask_Enabled==0
#pragma shader_feature_local _CLEARCOAT_MASK
//endex
diff --git a/globals.cginc b/globals.cginc
index 6d54720..c1eda2e 100755
--- a/globals.cginc
+++ b/globals.cginc
@@ -103,6 +103,12 @@ float _Clearcoat_Strength;
float _Clearcoat_Roughness;
#endif // _CLEARCOAT
+#if defined(_CLEARCOAT_NORMALS)
+texture2D _Clearcoat_Normals;
+float4 _Clearcoat_Normals_ST;
+float _Clearcoat_Normals_Strength;
+#endif // _CLEARCOAT_NORMALS
+
#if defined(_CLEARCOAT_MASK)
texture2D _Clearcoat_Mask;
float4 _Clearcoat_Mask_ST;
diff --git a/lighting.cginc b/lighting.cginc
index 2e3a79b..cde444a 100755
--- a/lighting.cginc
+++ b/lighting.cginc
@@ -207,7 +207,7 @@ void GetLighting(v2f i, Pbr pbr, out LightData data) {
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));
+ data.common.NoV_cc = saturate(dot(pbr.cc_normal, data.common.V));
#endif
// Direct lighting
@@ -221,8 +221,8 @@ void GetLighting(v2f i, Pbr pbr, out LightData data) {
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));
+ data.direct.NoH_cc = saturate(dot(pbr.cc_normal, data.direct.H));
+ data.direct.NoL_cc = saturate(dot(pbr.cc_normal, data.direct.dir));
#endif
float direct_LoV = dot(data.direct.dir, data.common.V);
data.direct.LoV = saturate(direct_LoV);
@@ -240,8 +240,8 @@ 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 cc_reflect_dir = reflect(-data.common.V, i.normal);
- float3 cc_dominant_dir = getSpecularDominantDirection(i.normal, cc_reflect_dir, pbr.cc_roughness);
+ 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
diff --git a/pbr.cginc b/pbr.cginc
index d79d58d..be1be5a 100755
--- a/pbr.cginc
+++ b/pbr.cginc
@@ -195,7 +195,16 @@ Pbr getPbr(v2f i) {
pbr.cc_roughness = _Clearcoat_Roughness;
pbr.cc_roughness_perceptual = sqrt(pbr.cc_roughness);
pbr.cc_strength = _Clearcoat_Strength;
-#endif
+#if defined(_CLEARCOAT_NORMALS)
+ float3 cc_normal_ts = UnpackNormal(_Clearcoat_Normals.Sample(
+ aniso4_trilinear_repeat_s, uv_parallax * _Clearcoat_Normals_ST.xy +
+ _Clearcoat_Normals_ST.zw));
+ cc_normal_ts.xy *= _Clearcoat_Normals_Strength;
+ pbr.cc_normal = normalize(mul(cc_normal_ts, pbr.tbn));
+#else
+ pbr.cc_normal = i.normal;
+#endif // _CLEARCOAT_NORMALS
+#endif // _CLEARCOAT
propagateSmoothness(pbr);
#if defined(_EMISSIONS) && defined(FORWARD_BASE_PASS)