From 70f2b5fa235ec7b23eb8d9710bd7a3e5934211df Mon Sep 17 00:00:00 2001 From: yum Date: Tue, 28 Jul 2026 10:08:59 -0700 Subject: Add replace alpha option to decals --- 3ner.shader | 8 ++++++++ decal.cginc | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- features.cginc | 8 ++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/3ner.shader b/3ner.shader index c18668a..8cc095b 100755 --- a/3ner.shader +++ b/3ner.shader @@ -96,6 +96,7 @@ Shader "yum_food/3ner" [ThryWideEnum(AlphaBlend, 0, Multiply, 1, AddProduct, 2)] _Decal0_Mix_Mode("Mix Mode", Int) = 0 [IntRange] _Decal0_UV_Channel("UV Channel", Range(0, 3)) = 0 [ThryToggle(_DECAL0_ALBEDO_CLAMP)] _Decal0_Albedo_Clamp("Clamp albedo", Float) = 0 + [ThryToggle(_DECAL0_REPLACE_ALPHA)] _Decal0_Replace_Alpha("Replace alpha", Float) = 0 //ifex _Decal0_Mask_Enabled==0 [HideInInspector] m_start_Decal0_Mask("Mask", Float) = 0 @@ -150,6 +151,7 @@ Shader "yum_food/3ner" [ThryWideEnum(AlphaBlend, 0, Multiply, 1, AddProduct, 2)] _Decal1_Mix_Mode("Mix Mode", Int) = 0 [IntRange] _Decal1_UV_Channel("UV Channel", Range(0, 3)) = 0 [ThryToggle(_DECAL1_ALBEDO_CLAMP)] _Decal1_Albedo_Clamp("Clamp albedo", Float) = 0 + [ThryToggle(_DECAL1_REPLACE_ALPHA)] _Decal1_Replace_Alpha("Replace alpha", Float) = 0 //ifex _Decal1_Mask_Enabled==0 [HideInInspector] m_start_Decal1_Mask("Mask", Float) = 0 @@ -204,6 +206,7 @@ Shader "yum_food/3ner" [ThryWideEnum(AlphaBlend, 0, Multiply, 1, AddProduct, 2)] _Decal2_Mix_Mode("Mix Mode", Int) = 0 [IntRange] _Decal2_UV_Channel("UV Channel", Range(0, 3)) = 0 [ThryToggle(_DECAL2_ALBEDO_CLAMP)] _Decal2_Albedo_Clamp("Clamp albedo", Float) = 0 + [ThryToggle(_DECAL2_REPLACE_ALPHA)] _Decal2_Replace_Alpha("Replace alpha", Float) = 0 //ifex _Decal2_Mask_Enabled==0 [HideInInspector] m_start_Decal2_Mask("Mask", Float) = 0 @@ -258,6 +261,7 @@ Shader "yum_food/3ner" [ThryWideEnum(AlphaBlend, 0, Multiply, 1, AddProduct, 2)] _Decal3_Mix_Mode("Mix Mode", Int) = 0 [IntRange] _Decal3_UV_Channel("UV Channel", Range(0, 3)) = 0 [ThryToggle(_DECAL3_ALBEDO_CLAMP)] _Decal3_Albedo_Clamp("Clamp albedo", Float) = 0 + [ThryToggle(_DECAL3_REPLACE_ALPHA)] _Decal3_Replace_Alpha("Replace alpha", Float) = 0 //ifex _Decal3_Mask_Enabled==0 [HideInInspector] m_start_Decal3_Mask("Mask", Float) = 0 @@ -312,6 +316,7 @@ Shader "yum_food/3ner" [ThryWideEnum(AlphaBlend, 0, Multiply, 1, AddProduct, 2)] _Decal4_Mix_Mode("Mix Mode", Int) = 0 [IntRange] _Decal4_UV_Channel("UV Channel", Range(0, 3)) = 0 [ThryToggle(_DECAL4_ALBEDO_CLAMP)] _Decal4_Albedo_Clamp("Clamp albedo", Float) = 0 + [ThryToggle(_DECAL4_REPLACE_ALPHA)] _Decal4_Replace_Alpha("Replace alpha", Float) = 0 //ifex _Decal4_Mask_Enabled==0 [HideInInspector] m_start_Decal4_Mask("Mask", Float) = 0 @@ -366,6 +371,7 @@ Shader "yum_food/3ner" [ThryWideEnum(AlphaBlend, 0, Multiply, 1, AddProduct, 2)] _Decal5_Mix_Mode("Mix Mode", Int) = 0 [IntRange] _Decal5_UV_Channel("UV Channel", Range(0, 3)) = 0 [ThryToggle(_DECAL5_ALBEDO_CLAMP)] _Decal5_Albedo_Clamp("Clamp albedo", Float) = 0 + [ThryToggle(_DECAL5_REPLACE_ALPHA)] _Decal5_Replace_Alpha("Replace alpha", Float) = 0 //ifex _Decal5_Mask_Enabled==0 [HideInInspector] m_start_Decal5_Mask("Mask", Float) = 0 @@ -420,6 +426,7 @@ Shader "yum_food/3ner" [ThryWideEnum(AlphaBlend, 0, Multiply, 1, AddProduct, 2)] _Decal6_Mix_Mode("Mix Mode", Int) = 0 [IntRange] _Decal6_UV_Channel("UV Channel", Range(0, 3)) = 0 [ThryToggle(_DECAL6_ALBEDO_CLAMP)] _Decal6_Albedo_Clamp("Clamp albedo", Float) = 0 + [ThryToggle(_DECAL6_REPLACE_ALPHA)] _Decal6_Replace_Alpha("Replace alpha", Float) = 0 //ifex _Decal6_Mask_Enabled==0 [HideInInspector] m_start_Decal6_Mask("Mask", Float) = 0 @@ -474,6 +481,7 @@ Shader "yum_food/3ner" [ThryWideEnum(AlphaBlend, 0, Multiply, 1, AddProduct, 2)] _Decal7_Mix_Mode("Mix Mode", Int) = 0 [IntRange] _Decal7_UV_Channel("UV Channel", Range(0, 3)) = 0 [ThryToggle(_DECAL7_ALBEDO_CLAMP)] _Decal7_Albedo_Clamp("Clamp albedo", Float) = 0 + [ThryToggle(_DECAL7_REPLACE_ALPHA)] _Decal7_Replace_Alpha("Replace alpha", Float) = 0 //ifex _Decal7_Mask_Enabled==0 [HideInInspector] m_start_Decal7_Mask("Mask", Float) = 0 diff --git a/decal.cginc b/decal.cginc index a2092da..e917fdf 100644 --- a/decal.cginc +++ b/decal.cginc @@ -27,6 +27,58 @@ float2 decal_rotate(float2 uv, float rotation) { return float2(d.x * c - d.y * s, d.x * s + d.y * c) + 0.5; } +#if defined(_DECAL0_REPLACE_ALPHA) +#define APPLY_DECAL_REPLACE_ALPHA_0 pbr.albedo.a = lerp(albedo_alpha_before_decal, decal_alpha_at_full_opacity, _Decal0_Opacity); +#else +#define APPLY_DECAL_REPLACE_ALPHA_0 +#endif +#if defined(_DECAL1_REPLACE_ALPHA) +#define APPLY_DECAL_REPLACE_ALPHA_1 pbr.albedo.a = lerp(albedo_alpha_before_decal, decal_alpha_at_full_opacity, _Decal1_Opacity); +#else +#define APPLY_DECAL_REPLACE_ALPHA_1 +#endif +#if defined(_DECAL2_REPLACE_ALPHA) +#define APPLY_DECAL_REPLACE_ALPHA_2 pbr.albedo.a = lerp(albedo_alpha_before_decal, decal_alpha_at_full_opacity, _Decal2_Opacity); +#else +#define APPLY_DECAL_REPLACE_ALPHA_2 +#endif +#if defined(_DECAL3_REPLACE_ALPHA) +#define APPLY_DECAL_REPLACE_ALPHA_3 pbr.albedo.a = lerp(albedo_alpha_before_decal, decal_alpha_at_full_opacity, _Decal3_Opacity); +#else +#define APPLY_DECAL_REPLACE_ALPHA_3 +#endif +#if defined(_DECAL4_REPLACE_ALPHA) +#define APPLY_DECAL_REPLACE_ALPHA_4 pbr.albedo.a = lerp(albedo_alpha_before_decal, decal_alpha_at_full_opacity, _Decal4_Opacity); +#else +#define APPLY_DECAL_REPLACE_ALPHA_4 +#endif +#if defined(_DECAL5_REPLACE_ALPHA) +#define APPLY_DECAL_REPLACE_ALPHA_5 pbr.albedo.a = lerp(albedo_alpha_before_decal, decal_alpha_at_full_opacity, _Decal5_Opacity); +#else +#define APPLY_DECAL_REPLACE_ALPHA_5 +#endif +#if defined(_DECAL6_REPLACE_ALPHA) +#define APPLY_DECAL_REPLACE_ALPHA_6 pbr.albedo.a = lerp(albedo_alpha_before_decal, decal_alpha_at_full_opacity, _Decal6_Opacity); +#else +#define APPLY_DECAL_REPLACE_ALPHA_6 +#endif +#if defined(_DECAL7_REPLACE_ALPHA) +#define APPLY_DECAL_REPLACE_ALPHA_7 pbr.albedo.a = lerp(albedo_alpha_before_decal, decal_alpha_at_full_opacity, _Decal7_Opacity); +#else +#define APPLY_DECAL_REPLACE_ALPHA_7 +#endif + +#if defined(_DECAL0_REPLACE_ALPHA) || defined(_DECAL1_REPLACE_ALPHA) || defined(_DECAL2_REPLACE_ALPHA) || defined(_DECAL3_REPLACE_ALPHA) || defined(_DECAL4_REPLACE_ALPHA) || defined(_DECAL5_REPLACE_ALPHA) || defined(_DECAL6_REPLACE_ALPHA) || defined(_DECAL7_REPLACE_ALPHA) +#define PREPARE_DECAL_REPLACE_ALPHA \ + float albedo_alpha_before_decal = pbr.albedo.a; \ + float decal_alpha_at_full_opacity = albedo.a; +#else +#define PREPARE_DECAL_REPLACE_ALPHA +#endif + +#define APPLY_DECAL_REPLACE_ALPHA_IMPL(N) APPLY_DECAL_REPLACE_ALPHA_##N +#define APPLY_DECAL_REPLACE_ALPHA(N) APPLY_DECAL_REPLACE_ALPHA_IMPL(N) + #define APPLY_DECAL(N) \ { \ float2 uv = get_uv_by_channel(i, _Decal##N##_UV_Channel); \ @@ -43,7 +95,6 @@ float2 decal_rotate(float2 uv, float rotation) { albedo.a = smoothstep(-w, w, d); \ } \ albedo *= _Decal##N##_Color; \ - albedo.a *= _Decal##N##_Opacity; \ if (_Decal##N##_Mask_Enabled) { \ float2 mask_uv = get_uv_by_channel(i, _Decal##N##_Mask_UV_Channel); \ mask_uv -= _Decal##N##_Mask_ST.zw; \ @@ -52,6 +103,8 @@ float2 decal_rotate(float2 uv, float rotation) { if (_Decal##N##_Mask_Invert) mask = 1 - mask; \ albedo.a *= mask; \ } \ + PREPARE_DECAL_REPLACE_ALPHA \ + albedo.a *= _Decal##N##_Opacity; \ if (_Decal##N##_Albedo_Clamp) albedo.rgb = saturate(albedo.rgb); \ [forcecase] \ switch (_Decal##N##_Mix_Mode) { \ @@ -65,6 +118,7 @@ float2 decal_rotate(float2 uv, float rotation) { pbr.albedo.rgb += lerp(0, albedo.rgb * pbr.albedo.rgb, albedo.a); \ break; \ } \ + APPLY_DECAL_REPLACE_ALPHA(N) \ if (_Decal##N##_Metallic_Gloss_Enabled) { \ float4 mg = decal_sample(_Decal##N##_Metallic_Gloss, uv, _Decal##N##_UV_Mode); \ pbr.metallic = lerp(pbr.metallic, mg.r * _Decal##N##_Metallic, albedo.a); \ diff --git a/features.cginc b/features.cginc index 6b7efcf..5076d66 100755 --- a/features.cginc +++ b/features.cginc @@ -210,34 +210,42 @@ //ifex _Decal0_Enabled==0 #pragma shader_feature_local _DECAL0 +#pragma shader_feature_local _DECAL0_REPLACE_ALPHA //endex //ifex _Decal1_Enabled==0 #pragma shader_feature_local _DECAL1 +#pragma shader_feature_local _DECAL1_REPLACE_ALPHA //endex //ifex _Decal2_Enabled==0 #pragma shader_feature_local _DECAL2 +#pragma shader_feature_local _DECAL2_REPLACE_ALPHA //endex //ifex _Decal3_Enabled==0 #pragma shader_feature_local _DECAL3 +#pragma shader_feature_local _DECAL3_REPLACE_ALPHA //endex //ifex _Decal4_Enabled==0 #pragma shader_feature_local _DECAL4 +#pragma shader_feature_local _DECAL4_REPLACE_ALPHA //endex //ifex _Decal5_Enabled==0 #pragma shader_feature_local _DECAL5 +#pragma shader_feature_local _DECAL5_REPLACE_ALPHA //endex //ifex _Decal6_Enabled==0 #pragma shader_feature_local _DECAL6 +#pragma shader_feature_local _DECAL6_REPLACE_ALPHA //endex //ifex _Decal7_Enabled==0 #pragma shader_feature_local _DECAL7 +#pragma shader_feature_local _DECAL7_REPLACE_ALPHA //endex //ifex _Matcap0_Enabled==0 -- cgit v1.2.3