summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2025-04-24 12:24:38 -0700
committeryum <yum.food.vr@gmail.com>2025-04-24 12:25:01 -0700
commit9a3459e7ba2c33376d9e705f751b1ac571509f92 (patch)
treec63c00adbfc79e434beb9ff78149863529d3f49c
parent7aae547b83c94ff3ecf62524809ecb21d6061d33 (diff)
add cmyk warping planes gimmick to decals
renders the decal 4 times one planes, and applies domain warping to each plane. Requires a 4-channel (RGBA) noise texture.
-rw-r--r--2ner.shader36
-rw-r--r--decals.cginc94
-rw-r--r--features.cginc4
-rw-r--r--globals.cginc7
-rw-r--r--math.cginc37
5 files changed, 159 insertions, 19 deletions
diff --git a/2ner.shader b/2ner.shader
index cfb9bf3..9816621 100644
--- a/2ner.shader
+++ b/2ner.shader
@@ -322,8 +322,17 @@ Shader "yum_food/2ner"
[MaterialToggle] _Decal0_SDF_Invert("SDF invert", Float) = 0
_Decal0_SDF_Softness("SDF softness", Range(0, 1)) = 0.01
_Decal0_SDF_Px_Range("SDF px range", Float) = 2
+ //ifex _Decal0_CMYK_Warping_Planes_Enabled==0
+ [HideInInspector] m_start_Decal0_CMYK_Warping_Planes("CMYK warping planes", Float) = 0
+ [ThryToggle(_DECAL0_CMYK_WARPING_PLANES)] _Decal0_CMYK_Warping_Planes_Enabled("Enable", Float) = 0
+ _Decal0_CMYK_Warping_Planes_Noise("Noise", 2D) = "black" {}
+ _Decal0_CMYK_Warping_Planes_Strength("Strength", Float) = 0.1
+ _Decal0_CMYK_Warping_Planes_Scale("Scale", Float) = 0.1
+ _Decal0_CMYK_Warping_Planes_Speed("Speed", Float) = 1.0
+ [HideInInspector] m_end_Decal0_CMYK_Warping_Planes("CMYK warping planes", Float) = 0
[HideInInspector] m_end_Decal0_SDF("SDF", Float) = 0
//endex
+ //endex
//ifex _Decal0_Mask_Enabled==0
[HideInInspector] m_start_Decal0_Mask("Mask", Float) = 0
[ThryToggle(_DECAL0_MASK)] _Decal0_Mask_Enabled("Enable", Float) = 0
@@ -364,8 +373,17 @@ Shader "yum_food/2ner"
[MaterialToggle] _Decal1_SDF_Invert("SDF invert", Float) = 0
_Decal1_SDF_Softness("SDF softness", Range(0, 1)) = 0.01
_Decal1_SDF_Px_Range("SDF px range", Float) = 2
+ //ifex _Decal1_CMYK_Warping_Planes_Enabled==0
+ [HideInInspector] m_start_Decal1_CMYK_Warping_Planes("CMYK warping planes", Float) = 0
+ [ThryToggle(_DECAL1_CMYK_WARPING_PLANES)] _Decal1_CMYK_Warping_Planes_Enabled("Enable", Float) = 0
+ _Decal1_CMYK_Warping_Planes_Noise("Noise", 2D) = "black" {}
+ _Decal1_CMYK_Warping_Planes_Strength("Strength", Float) = 0.1
+ _Decal1_CMYK_Warping_Planes_Scale("Scale", Float) = 0.1
+ _Decal1_CMYK_Warping_Planes_Speed("Speed", Float) = 1.0
+ [HideInInspector] m_end_Decal1_CMYK_Warping_Planes("CMYK warping planes", Float) = 0
[HideInInspector] m_end_Decal1_SDF("SDF", Float) = 0
//endex
+ //endex
//ifex _Decal1_Mask_Enabled==0
[HideInInspector] m_start_Decal1_Mask("Mask", Float) = 0
[ThryToggle(_DECAL1_MASK)] _Decal1_Mask_Enabled("Enable", Float) = 0
@@ -406,8 +424,17 @@ Shader "yum_food/2ner"
[MaterialToggle] _Decal2_SDF_Invert("SDF invert", Float) = 0
_Decal2_SDF_Softness("SDF softness", Range(0, 1)) = 0.01
_Decal2_SDF_Px_Range("SDF px range", Float) = 2
+ //ifex _Decal2_CMYK_Warping_Planes_Enabled==0
+ [HideInInspector] m_start_Decal2_CMYK_Warping_Planes("CMYK warping planes", Float) = 0
+ [ThryToggle(_DECAL2_CMYK_WARPING_PLANES)] _Decal2_CMYK_Warping_Planes_Enabled("Enable", Float) = 0
+ _Decal2_CMYK_Warping_Planes_Noise("Noise", 2D) = "black" {}
+ _Decal2_CMYK_Warping_Planes_Strength("Strength", Float) = 0.1
+ _Decal2_CMYK_Warping_Planes_Scale("Scale", Float) = 0.1
+ _Decal2_CMYK_Warping_Planes_Speed("Speed", Float) = 1.0
+ [HideInInspector] m_end_Decal2_CMYK_Warping_Planes("CMYK warping planes", Float) = 0
[HideInInspector] m_end_Decal2_SDF("SDF", Float) = 0
//endex
+ //endex
//ifex _Decal2_Mask_Enabled==0
[HideInInspector] m_start_Decal2_Mask("Mask", Float) = 0
[ThryToggle(_DECAL2_MASK)] _Decal2_Mask_Enabled("Enable", Float) = 0
@@ -448,8 +475,17 @@ Shader "yum_food/2ner"
[MaterialToggle] _Decal3_SDF_Invert("SDF invert", Float) = 0
_Decal3_SDF_Softness("SDF softness", Range(0, 1)) = 0.01
_Decal3_SDF_Px_Range("SDF px range", Float) = 2
+ //ifex _Decal3_CMYK_Warping_Planes_Enabled==0
+ [HideInInspector] m_start_Decal3_CMYK_Warping_Planes("CMYK warping planes", Float) = 0
+ [ThryToggle(_DECAL3_CMYK_WARPING_PLANES)] _Decal3_CMYK_Warping_Planes_Enabled("Enable", Float) = 0
+ _Decal3_CMYK_Warping_Planes_Noise("Noise", 2D) = "black" {}
+ _Decal3_CMYK_Warping_Planes_Strength("Strength", Float) = 0.1
+ _Decal3_CMYK_Warping_Planes_Scale("Scale", Float) = 0.1
+ _Decal3_CMYK_Warping_Planes_Speed("Speed", Float) = 1.0
+ [HideInInspector] m_end_Decal3_CMYK_Warping_Planes("CMYK warping planes", Float) = 0
[HideInInspector] m_end_Decal3_SDF("SDF", Float) = 0
//endex
+ //endex
//ifex _Decal3_Mask_Enabled==0
[HideInInspector] m_start_Decal3_Mask("Mask", Float) = 0
[ThryToggle(_DECAL3_MASK)] _Decal3_Mask_Enabled("Enable", Float) = 0
diff --git a/decals.cginc b/decals.cginc
index bc49493..45a9354 100644
--- a/decals.cginc
+++ b/decals.cginc
@@ -28,6 +28,10 @@ struct DecalParams {
Texture2D metallicGlossMap;
float metallic_value;
float smoothness_value;
+ Texture2D cmyk_warping_planes_noise;
+ float cmyk_warping_planes_strength;
+ float cmyk_warping_planes_scale;
+ float cmyk_warping_planes_speed;
};
// Macro to initialize decal parameters
@@ -51,7 +55,57 @@ struct DecalParams {
params.reflections_enabled = prefix##Reflections_Enabled; \
params.metallicGlossMap = prefix##MetallicGlossMap; \
params.metallic_value = prefix##Metallic; \
- params.smoothness_value = prefix##Smoothness
+ params.smoothness_value = prefix##Smoothness; \
+ params.cmyk_warping_planes_noise = prefix##CMYK_Warping_Planes_Noise; \
+ params.cmyk_warping_planes_strength = prefix##CMYK_Warping_Planes_Strength; \
+ params.cmyk_warping_planes_scale = prefix##CMYK_Warping_Planes_Scale; \
+ params.cmyk_warping_planes_speed = prefix##CMYK_Warping_Planes_Speed;
+
+float4 getDecalColor(DecalParams params, float2 uv) {
+ float4 sdf_sample = params.mainTex.SampleLevel(linear_repeat_s, uv, 0);
+ float sd = sdf_sample.r;
+ sd = params.sdf_invert ? 1 - sd : sd;
+ sd = (sd > params.sdf_threshold ? 1 : 0);
+ return params.color * sd;
+}
+
+float4 getCmykWarpingPlanesColor(DecalParams params, float2 uv) {
+ float4 noise = params.cmyk_warping_planes_noise.SampleLevel(linear_repeat_s, uv, 0);
+
+ float amplitude = params.cmyk_warping_planes_strength;
+ float frequency = params.cmyk_warping_planes_scale;
+
+ // Process pairs of planes in each loop.
+ float4 warped_uv[2] = {float4(uv, uv), float4(uv, uv)};
+ [loop]
+ for (uint jj = 0; jj < 2; jj++) {
+ float2 speed_direction = float2(
+ jj % 2 == 0 ? 1 : -1,
+ jj / 2 == 0 ? 1 : -1);
+ float2 time_offset = speed_direction * _Time.y * params.cmyk_warping_planes_speed;
+ {
+ float2 noise_uv = warped_uv[jj] * frequency + time_offset;
+ float4 noise = params.cmyk_warping_planes_noise.SampleLevel(trilinear_repeat_s, noise_uv, 0);
+ noise = (noise * 2.0 - 1.0);
+ warped_uv[jj].xy += noise.xy * amplitude;
+ warped_uv[jj].zw += noise.zw * amplitude;
+ }
+ }
+
+ float4 decal_color0 = getDecalColor(params, warped_uv[0].xy);
+ float4 decal_color1 = getDecalColor(params, warped_uv[0].zw);
+ float4 decal_color2 = getDecalColor(params, warped_uv[1].xy);
+ float4 decal_color3 = getDecalColor(params, warped_uv[1].zw);
+
+ float4 final_cmyk = float4(
+ rgbToCmyk_C(decal_color0.rgb),
+ rgbToCmyk_M(decal_color1.rgb),
+ rgbToCmyk_Y(decal_color2.rgb),
+ rgbToCmyk_K(decal_color3.rgb));
+
+ float3 final_rgb = saturate(cmykToRgb(final_cmyk));
+ return float4(final_rgb, decal_color0.a + decal_color1.a + decal_color2.a + decal_color3.a);
+}
#define APPLY_DECAL_SEC00_GENERIC(i, albedo, normal_tangent, metallic, smoothness, params) \
float2x2 decal_rot = float2x2( \
@@ -65,15 +119,11 @@ struct DecalParams {
decal_uv = mul(decal_rot, decal_uv - 0.5) + 0.5; \
decal_uv = (params.tiling_mode == DECAL_TILING_MODE_CLAMP ? saturate(decal_uv) : decal_uv);
-#define APPLY_DECAL_SEC01_SDF_ON(i, albedo, normal_tangent, metallic, smoothness, params) \
- float4 decal_albedo; \
- { \
- float4 sdf_sample = params.mainTex.SampleLevel(linear_repeat_s, decal_uv, 0); \
- float sd = sdf_sample.r; \
- sd = params.sdf_invert ? 1 - sd : sd; \
- sd = (sd > params.sdf_threshold ? 1 : 0); \
- decal_albedo = params.color * sd; \
- }
+#define APPLY_DECAL_SEC01_SDF_ON_WARPING_ON(i, albedo, normal_tangent, metallic, smoothness, params) \
+ float4 decal_albedo = getCmykWarpingPlanesColor(params, decal_uv);
+
+#define APPLY_DECAL_SEC01_SDF_ON_WARPING_OFF(i, albedo, normal_tangent, metallic, smoothness, params) \
+ float4 decal_albedo = getDecalColor(params, decal_uv);
#define APPLY_DECAL_SEC01_SDF_OFF(i, albedo, normal_tangent, metallic, smoothness, params) \
float4 decal_albedo; \
@@ -127,8 +177,10 @@ void applyDecals(in v2f i, inout float4 albedo, inout float3 normal_tangent, ino
{
INIT_DECAL_PARAMS(decal, _Decal0_);
APPLY_DECAL_SEC00_GENERIC(i, albedo, normal_tangent, metallic, smoothness, decal);
- #if defined(_DECAL0_SDF)
- APPLY_DECAL_SEC01_SDF_ON(i, albedo, normal_tangent, metallic, smoothness, decal);
+ #if defined(_DECAL0_SDF) && defined(_DECAL0_CMYK_WARPING_PLANES)
+ APPLY_DECAL_SEC01_SDF_ON_WARPING_ON(i, albedo, normal_tangent, metallic, smoothness, decal);
+ #elif defined(_DECAL0_SDF)
+ APPLY_DECAL_SEC01_SDF_ON_WARPING_OFF(i, albedo, normal_tangent, metallic, smoothness, decal);
#else
APPLY_DECAL_SEC01_SDF_OFF(i, albedo, normal_tangent, metallic, smoothness, decal);
#endif
@@ -163,8 +215,10 @@ void applyDecals(in v2f i, inout float4 albedo, inout float3 normal_tangent, ino
{
INIT_DECAL_PARAMS(decal, _Decal1_);
APPLY_DECAL_SEC00_GENERIC(i, albedo, normal_tangent, metallic, smoothness, decal);
- #if defined(_DECAL1_SDF)
- APPLY_DECAL_SEC01_SDF_ON(i, albedo, normal_tangent, metallic, smoothness, decal);
+ #if defined(_DECAL1_SDF) && defined(_DECAL1_CMYK_WARPING_PLANES)
+ APPLY_DECAL_SEC01_SDF_ON_WARPING_ON(i, albedo, normal_tangent, metallic, smoothness, decal);
+ #elif defined(_DECAL1_SDF)
+ APPLY_DECAL_SEC01_SDF_ON_WARPING_OFF(i, albedo, normal_tangent, metallic, smoothness, decal);
#else
APPLY_DECAL_SEC01_SDF_OFF(i, albedo, normal_tangent, metallic, smoothness, decal);
#endif
@@ -199,8 +253,10 @@ void applyDecals(in v2f i, inout float4 albedo, inout float3 normal_tangent, ino
{
INIT_DECAL_PARAMS(decal, _Decal2_);
APPLY_DECAL_SEC00_GENERIC(i, albedo, normal_tangent, metallic, smoothness, decal);
- #if defined(_DECAL2_SDF)
- APPLY_DECAL_SEC01_SDF_ON(i, albedo, normal_tangent, metallic, smoothness, decal);
+ #if defined(_DECAL2_SDF) && defined(_DECAL2_CMYK_WARPING_PLANES)
+ APPLY_DECAL_SEC01_SDF_ON_WARPING_ON(i, albedo, normal_tangent, metallic, smoothness, decal);
+ #elif defined(_DECAL2_SDF)
+ APPLY_DECAL_SEC01_SDF_ON_WARPING_OFF(i, albedo, normal_tangent, metallic, smoothness, decal);
#else
APPLY_DECAL_SEC01_SDF_OFF(i, albedo, normal_tangent, metallic, smoothness, decal);
#endif
@@ -235,8 +291,10 @@ void applyDecals(in v2f i, inout float4 albedo, inout float3 normal_tangent, ino
{
INIT_DECAL_PARAMS(decal, _Decal3_);
APPLY_DECAL_SEC00_GENERIC(i, albedo, normal_tangent, metallic, smoothness, decal);
- #if defined(_DECAL3_SDF)
- APPLY_DECAL_SEC01_SDF_ON(i, albedo, normal_tangent, metallic, smoothness, decal);
+ #if defined(_DECAL3_SDF) && defined(_DECAL3_CMYK_WARPING_PLANES)
+ APPLY_DECAL_SEC01_SDF_ON_WARPING_ON(i, albedo, normal_tangent, metallic, smoothness, decal);
+ #elif defined(_DECAL3_SDF)
+ APPLY_DECAL_SEC01_SDF_ON_WARPING_OFF(i, albedo, normal_tangent, metallic, smoothness, decal);
#else
APPLY_DECAL_SEC01_SDF_OFF(i, albedo, normal_tangent, metallic, smoothness, decal);
#endif
diff --git a/features.cginc b/features.cginc
index 716c032..4e10ec8 100644
--- a/features.cginc
+++ b/features.cginc
@@ -119,6 +119,7 @@
#pragma shader_feature_local _DECAL0_MASK
#pragma shader_feature_local _DECAL0_TILING_MODE
#pragma shader_feature_local _DECAL0_REPLACE_ALPHA
+#pragma shader_feature_local _DECAL0_CMYK_WARPING_PLANES
//endex
//ifex _Decal1_Enabled==0
#pragma shader_feature_local _DECAL1
@@ -128,6 +129,7 @@
#pragma shader_feature_local _DECAL1_MASK
#pragma shader_feature_local _DECAL1_TILING_MODE
#pragma shader_feature_local _DECAL1_REPLACE_ALPHA
+#pragma shader_feature_local _DECAL1_CMYK_WARPING_PLANES
//endex
//ifex _Decal2_Enabled==0
#pragma shader_feature_local _DECAL2
@@ -137,6 +139,7 @@
#pragma shader_feature_local _DECAL2_MASK
#pragma shader_feature_local _DECAL2_TILING_MODE
#pragma shader_feature_local _DECAL2_REPLACE_ALPHA
+#pragma shader_feature_local _DECAL2_CMYK_WARPING_PLANES
//endex
//ifex _Decal3_Enabled==0
#pragma shader_feature_local _DECAL3
@@ -146,6 +149,7 @@
#pragma shader_feature_local _DECAL3_MASK
#pragma shader_feature_local _DECAL3_TILING_MODE
#pragma shader_feature_local _DECAL3_REPLACE_ALPHA
+#pragma shader_feature_local _DECAL3_CMYK_WARPING_PLANES
//endex
//ifex _3D_SDF_Enabled==0
diff --git a/globals.cginc b/globals.cginc
index 955cc2a..bfe71cb 100644
--- a/globals.cginc
+++ b/globals.cginc
@@ -268,7 +268,12 @@ float _Decal##n##_SDF_Px_Range; \
\
float _Decal##n##_Mask_Enabled; \
texture2D _Decal##n##_Mask; \
-float4 _Decal##n##_Mask_ST;
+float4 _Decal##n##_Mask_ST; \
+\
+texture2D _Decal##n##_CMYK_Warping_Planes_Noise; \
+float _Decal##n##_CMYK_Warping_Planes_Strength; \
+float _Decal##n##_CMYK_Warping_Planes_Scale; \
+float _Decal##n##_CMYK_Warping_Planes_Speed;
#if defined(_DECAL0)
DECLARE_DECAL_VARIABLES(0)
diff --git a/math.cginc b/math.cginc
index f2b64fa..8ada893 100644
--- a/math.cginc
+++ b/math.cginc
@@ -246,4 +246,41 @@ void calcNormalInScreenSpace(inout float3 normal, float3 objPos) {
normal = normalize(cross(ddy(objPos), ddx(objPos)));
}
+// Formulae from here: https://www.rapidtables.com/convert/color/rgb-to-cmyk.html
+float4 rgbToCmyk(float3 rgb) {
+ float4 cmyk;
+ cmyk[3] = 1 - max(rgb.r, max(rgb.g, rgb.b));
+ cmyk[0] = (1 - rgb.r - cmyk[3]) / (1 - cmyk[3]);
+ cmyk[1] = (1 - rgb.g - cmyk[3]) / (1 - cmyk[3]);
+ cmyk[2] = (1 - rgb.b - cmyk[3]) / (1 - cmyk[3]);
+ return cmyk;
+}
+
+float rgbToCmyk_C(float3 rgb) {
+ float k = 1 - max(rgb.r, max(rgb.g, rgb.b));
+ float c = (1 - rgb.r - k) / (1 - k);
+ return c;
+}
+float rgbToCmyk_M(float3 rgb) {
+ float k = 1 - max(rgb.r, max(rgb.g, rgb.b));
+ float m = (1 - rgb.g - k) / (1 - k);
+ return m;
+}
+float rgbToCmyk_Y(float3 rgb) {
+ float k = 1 - max(rgb.r, max(rgb.g, rgb.b));
+ float y = (1 - rgb.b - k) / (1 - k);
+ return y;
+}
+float rgbToCmyk_K(float3 rgb) {
+ float k = 1 - max(rgb.r, max(rgb.g, rgb.b));
+ return k;
+}
+
+float3 cmykToRgb(float4 cmyk) {
+ return float3(
+ (1 - cmyk[0]) * (1 - cmyk[3]),
+ (1 - cmyk[1]) * (1 - cmyk[3]),
+ (1 - cmyk[2]) * (1 - cmyk[3]));
+}
+
#endif // __MATH_INC