summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2026-07-28 10:08:59 -0700
committeryum <yum.food.vr@gmail.com>2026-07-28 10:08:59 -0700
commit70f2b5fa235ec7b23eb8d9710bd7a3e5934211df (patch)
tree69cb485cef3318854b09919a8ff10e88a787944c
parent110b619e8579a946f2448c61da380a8e4ae8cc48 (diff)
Add replace alpha option to decals
-rwxr-xr-x3ner.shader8
-rw-r--r--decal.cginc56
-rwxr-xr-xfeatures.cginc8
3 files changed, 71 insertions, 1 deletions
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