From 51e625816b01773577a5f54b7504548ce1af9acd Mon Sep 17 00:00:00 2001 From: yum Date: Wed, 11 Mar 2026 17:54:36 -0700 Subject: Add normal map to clearcoat --- 3ner.shader | 8 ++++++++ data.cginc | 1 + features.cginc | 4 ++++ globals.cginc | 6 ++++++ lighting.cginc | 10 +++++----- pbr.cginc | 11 ++++++++++- 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) -- cgit v1.2.3