From 9a3459e7ba2c33376d9e705f751b1ac571509f92 Mon Sep 17 00:00:00 2001 From: yum Date: Thu, 24 Apr 2025 12:24:38 -0700 Subject: 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. --- 2ner.shader | 36 ++++++++++++++++++++++ decals.cginc | 94 +++++++++++++++++++++++++++++++++++++++++++++++----------- features.cginc | 4 +++ globals.cginc | 7 ++++- math.cginc | 37 +++++++++++++++++++++++ 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 -- cgit v1.2.3