diff options
| author | yum <yum.food.vr@gmail.com> | 2026-03-11 17:54:36 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2026-03-11 17:54:36 -0700 |
| commit | 51e625816b01773577a5f54b7504548ce1af9acd (patch) | |
| tree | cfbe85e8b2af547cdbf7c6592d5d74d841b1b609 | |
| parent | c36b919595874355c511b2c75ba9797440be09a5 (diff) | |
Add normal map to clearcoat
| -rwxr-xr-x | 3ner.shader | 8 | ||||
| -rw-r--r-- | data.cginc | 1 | ||||
| -rwxr-xr-x | features.cginc | 4 | ||||
| -rwxr-xr-x | globals.cginc | 6 | ||||
| -rwxr-xr-x | lighting.cginc | 10 | ||||
| -rwxr-xr-x | 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 @@ -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 @@ -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) |
