diff options
| author | yum <yum.food.vr@gmail.com> | 2025-02-02 15:46:35 -0800 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2025-02-02 15:46:35 -0800 |
| commit | 03406b0983e123bb3203a96bfd2f017e58e3e90d (patch) | |
| tree | 859f888a409e2e92a25baf9597a0d4fae78d829b | |
| parent | ff997cfb850ec42a977381a2becf0ccedb2035d9 (diff) | |
Begin plugging in SSFD
| -rw-r--r-- | Editor/tooner.cs | 9 | ||||
| -rw-r--r-- | feature_macros.cginc | 1 | ||||
| -rw-r--r-- | globals.cginc | 5 | ||||
| -rw-r--r-- | tooner.shader | 3 | ||||
| -rw-r--r-- | tooner_lighting.cginc | 17 |
5 files changed, 30 insertions, 5 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs index 01e30ed..fefee6b 100644 --- a/Editor/tooner.cs +++ b/Editor/tooner.cs @@ -3389,6 +3389,7 @@ public class ToonerGUI : ShaderGUI { Stochastic, InterleavedGradientNoise, NoiseMask, + SurfaceStableFractalDithering, } // unity is made by fucking morons and they don't expose this so i'm @@ -3504,6 +3505,7 @@ public class ToonerGUI : ShaderGUI { SetKeyword("_RENDERING_CUTOUT_STOCHASTIC", cmode == CutoutMode.Stochastic); SetKeyword("_RENDERING_CUTOUT_IGN", cmode == CutoutMode.InterleavedGradientNoise); SetKeyword("_RENDERING_CUTOUT_NOISE_MASK", cmode == CutoutMode.NoiseMask); + SetKeyword("_RENDERING_CUTOUT_SSFD", cmode == CutoutMode.SurfaceStableFractalDithering); EditorGUI.indentLevel += 1; { @@ -3518,6 +3520,13 @@ public class ToonerGUI : ShaderGUI { } else if (cmode == CutoutMode.InterleavedGradientNoise) { bc = FindProperty("_Rendering_Cutout_Ign_Seed"); FloatProperty(bc, "Seed"); + } else if (cmode == CutoutMode.SurfaceStableFractalDithering) { + bc = FindProperty("_Rendering_Cutout_SSFD_Scale"); + FloatProperty(bc, "Scale"); + bc = FindProperty("_Rendering_Cutout_SSFD_Max_Fwidth"); + FloatProperty(bc, "Max fwidth"); + bc = FindProperty("_Rendering_Cutout_SSFD_Noise"); + TexturePropertySingleLine(MakeLabel(bc, "Noise"), bc); } bc = FindProperty("_Rendering_Cutout_Speed"); diff --git a/feature_macros.cginc b/feature_macros.cginc index d870fb9..98d439f 100644 --- a/feature_macros.cginc +++ b/feature_macros.cginc @@ -21,6 +21,7 @@ #pragma shader_feature_local _ _RENDERING_CUTOUT_STOCHASTIC #pragma shader_feature_local _ _RENDERING_CUTOUT_IGN #pragma shader_feature_local _ _RENDERING_CUTOUT_NOISE_MASK +#pragma shader_feature_local _ _RENDERING_CUTOUT_SSFD #pragma shader_feature_local _ _RENDERING_FADE #pragma shader_feature_local _ _RENDERING_TRANSPARENT #pragma shader_feature_local _ _RENDERING_TRANSCLIPPING diff --git a/globals.cginc b/globals.cginc index 578fb8e..d8a60d9 100644 --- a/globals.cginc +++ b/globals.cginc @@ -393,6 +393,11 @@ float _Rendering_Cutout_Speed; #if defined(_RENDERING_CUTOUT_IGN) float _Rendering_Cutout_Ign_Seed; #endif +#if defined(_RENDERING_CUTOUT_SSFD) +float _Rendering_Cutout_SSFD_Scale; +float _Rendering_Cutout_SSFD_Max_Fwidth; +texture3D _Rendering_Cutout_SSFD_Noise; +#endif #endif #if defined(_OUTLINES) diff --git a/tooner.shader b/tooner.shader index 15386c7..1660c3c 100644 --- a/tooner.shader +++ b/tooner.shader @@ -22,6 +22,9 @@ Shader "yum_food/tooner" _Rendering_Cutout_Noise_Mask("Noise mask", 2D) = "white" {} _Rendering_Cutout_Speed("Speed (for stochastic methods)", Float) = 1 + _Rendering_Cutout_SSFD_Scale("Scale", Float) = 1 + _Rendering_Cutout_SSFD_Max_Fwidth("Max fwidth", Float) = 1 + _Rendering_Cutout_SSFD_Noise("Noise", 3D) = "black" {} _MainTex("Base color", 2D) = "white" {} [Normal] _BumpMap("Normal", 2D) = "bump" {} diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc index 09043f5..b1bbab0 100644 --- a/tooner_lighting.cginc +++ b/tooner_lighting.cginc @@ -1033,7 +1033,6 @@ float ssfd(float2 uv, float scale, float max_fwidth, texture3D noise) float3 duv_3d = float3(duv, 0); #endif float dither = noise.SampleLevel(bilinear_repeat_s, duv_3d, 0); - dither = (dither > 0.5) ? 1 : 0; return dither; } @@ -1123,7 +1122,8 @@ float4 effect(inout v2f i, out float depth) #endif // _FRAME_COUNTER #if defined(_SURFACE_STABLE_FRACTAL_DITHERING) - albedo.rgb = ssfd(i.uv0, _Surface_Stable_Fractal_Dithering_Scale, _Surface_Stable_Fractal_Dithering_Max_Fwidth, _Surface_Stable_Fractal_Dithering_Noise); + float ssfd_raw = ssfd(i.uv0, _Surface_Stable_Fractal_Dithering_Scale, _Surface_Stable_Fractal_Dithering_Max_Fwidth, _Surface_Stable_Fractal_Dithering_Noise); + albedo.rgb = ssfd_raw > 0.5 ? 1 : 0; #endif #if defined(_GIMMICK_GERSTNER_WATER) @@ -1530,9 +1530,14 @@ float4 effect(inout v2f i, out float depth) _Rendering_Cutout_Noise_Mask_TexelSize.xy, 0); ar = frac(ar + frame * PHI * _Rendering_Cutout_Speed); clip(albedo.a - ar); +#elif defined(_RENDERING_CUTOUT_SSFD) + float ar = 1.0 - ssfd(i.uv0, _Rendering_Cutout_SSFD_Scale, _Rendering_Cutout_SSFD_Max_Fwidth, _Rendering_Cutout_SSFD_Noise); + ar = ar > albedo.a ? 1 : 0; + clip(albedo.a - ar); #else clip(albedo.a - _Alpha_Cutoff); #endif + albedo.a = 1; #endif // _RENDERING_CUTOUT @@ -2348,19 +2353,21 @@ float4 effect(inout v2f i, out float depth) uint2 bayer_idx = (glasses_uv_round % 8); #if defined(_GIMMICK_LENS_00_BAYER) float mask = BayerM8x8[bayer_idx.y * 8 + bayer_idx.x]; + mask = frac(mask + frame * PHI * _Gimmick_Lens_00_Frame_Counter_Speed); #elif defined(_GIMMICK_LENS_00_INTERLEAVED_GRADIENT_NOISE) float mask = ign(glasses_uv_round); + mask = frac(mask + frame * PHI * _Gimmick_Lens_00_Frame_Counter_Speed); #elif defined(_GIMMICK_LENS_00_SSFD) - float mask = ssfd(glasses_uv_round, _Gimmick_Lens_00_SSFD_Scale, _Gimmick_Lens_00_SSFD_Max_Fwidth, _Gimmick_Lens_00_SSFD_Noise); + float mask = ssfd(i.uv0, _Gimmick_Lens_00_SSFD_Scale, _Gimmick_Lens_00_SSFD_Max_Fwidth, _Gimmick_Lens_00_SSFD_Noise); + mask = mask > 0.5 ? 1 : 0; #endif - //mask = frac(mask + frame * PHI * _Gimmick_Lens_00_Frame_Counter_Speed); float2 grab_uv = i.grabPos.xy / i.grabPos.w; //grab_uv = floor(grab_uv * _ScreenParams.xy * _Gimmick_Lens_00_Scale) / (_ScreenParams.xy * _Gimmick_Lens_00_Scale); float3 grab_color = _Tooner_Grabpass.SampleLevel(linear_clamp_s, grab_uv, 0).rgb; grab_color = round(grab_color * _Gimmick_Lens_00_Subdivisions) / _Gimmick_Lens_00_Subdivisions; lit.rgb = (grab_color > mask); - lit.rgb = mask * .1; + //lit.rgb = mask; } #endif |
