summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2025-02-02 17:50:10 -0800
committeryum <yum.food.vr@gmail.com>2025-02-02 17:50:10 -0800
commitef659428910962a270840d1448123bfc6c87cccb (patch)
tree119fd7f7540039025d0ef6d7e8ceda689e28d54e
parent5f819329a161d54076d025d6f61656f262094c07 (diff)
More SSFD tweaks
-rw-r--r--Editor/tooner.cs13
-rw-r--r--globals.cginc6
-rw-r--r--tooner.shader10
-rw-r--r--tooner_lighting.cginc41
4 files changed, 47 insertions, 23 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs
index 9d7de84..fae2c47 100644
--- a/Editor/tooner.cs
+++ b/Editor/tooner.cs
@@ -3267,14 +3267,23 @@ public class ToonerGUI : ShaderGUI {
EditorGUI.indentLevel += 1;
+ bc = FindProperty("_Surface_Stable_Fractal_Dithering_Enable_Dynamic");
+ enabled = (bc.floatValue != 0.0);
+ EditorGUI.BeginChangeCheck();
+ enabled = Toggle("Enable (runtime switch)", enabled);
+ EditorGUI.EndChangeCheck();
+ bc.floatValue = enabled ? 1.0f : 0.0f;
+
bc = FindProperty("_Surface_Stable_Fractal_Dithering_Noise");
TexturePropertySingleLine(MakeLabel(bc, "Noise"), bc);
bc = FindProperty("_Surface_Stable_Fractal_Dithering_Scale");
RangeProperty(bc, "Scale");
bc = FindProperty("_Surface_Stable_Fractal_Dithering_Max_Fwidth");
FloatProperty(bc, "Max fwidth");
- bc = FindProperty("_Surface_Stable_Fractal_Dithering_Cutoff");
- RangeProperty(bc, "Cutoff");
+ bc = FindProperty("_Surface_Stable_Fractal_Dithering_Size_Factor");
+ FloatProperty(bc, "Size factor");
+ bc = FindProperty("_Surface_Stable_Fractal_Dithering_Brightness_Factor");
+ FloatProperty(bc, "Brightness factor");
EditorGUI.indentLevel -= 1;
}
diff --git a/globals.cginc b/globals.cginc
index d736afe..4045633 100644
--- a/globals.cginc
+++ b/globals.cginc
@@ -1150,12 +1150,16 @@ texture3D _Gimmick_Lens_00_SSFD_Noise;
#endif
#if defined(_SURFACE_STABLE_FRACTAL_DITHERING)
+float _Surface_Stable_Fractal_Dithering_Enable_Dynamic;
texture3D _Surface_Stable_Fractal_Dithering_Noise;
float _Surface_Stable_Fractal_Dithering_Scale;
float _Surface_Stable_Fractal_Dithering_Max_Fwidth;
-float _Surface_Stable_Fractal_Dithering_Cutoff;
+float _Surface_Stable_Fractal_Dithering_Size_Factor;
+float _Surface_Stable_Fractal_Dithering_Brightness_Factor;
#endif
+
+
#endif
diff --git a/tooner.shader b/tooner.shader
index 6f5d0d8..ea72eb8 100644
--- a/tooner.shader
+++ b/tooner.shader
@@ -1182,12 +1182,16 @@ Shader "yum_food/tooner"
_Gimmick_Lens_00_SSFD_Noise("Noise", 3D) = "white" {}
_Surface_Stable_Fractal_Dithering_Enable_Static("Enable stable fractal dithering", Float) = 0
+ _Surface_Stable_Fractal_Dithering_Enable_Dynamic("Enable stable fractal dithering (dynamic)", Float) = 0
_Surface_Stable_Fractal_Dithering_Noise("Noise", 3D) = "white" {}
- _Surface_Stable_Fractal_Dithering_Scale("Scale", Range(0, 1)) = 1
- _Surface_Stable_Fractal_Dithering_Max_Fwidth("Max fwidth", Float) = 0.001
- _Surface_Stable_Fractal_Dithering_Cutoff("Cutoff", Range(0, 1)) = 0.5
+ _Surface_Stable_Fractal_Dithering_Scale("Scale", Range(0, 1)) = .1
+ _Surface_Stable_Fractal_Dithering_Max_Fwidth("Max fwidth", Float) = 0.01
+ _Surface_Stable_Fractal_Dithering_Size_Factor("Size factor", Float) = 0.5
+ _Surface_Stable_Fractal_Dithering_Brightness_Factor("Brightness factor", Float) = 1
}
SubShader
+
+
{
GrabPass { "_Tooner_Grabpass" }
Tags {
diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc
index fde3339..6bf62ae 100644
--- a/tooner_lighting.cginc
+++ b/tooner_lighting.cginc
@@ -1121,19 +1121,6 @@ float4 effect(inout v2f i, out float depth)
const float frame = 0;
#endif // _FRAME_COUNTER
-#if defined(_SURFACE_STABLE_FRACTAL_DITHERING)
- {
- float3 light_dir = getDirectLightDirection(i);
- float3 light_color = getDirectLightColor();
- float shadow_attenuation = getShadowAttenuation(i);
- float ndotl = saturate(dot(i.normal, light_dir) * shadow_attenuation);
- float light_intensity = ndotl * length(light_color);
- float ssfd_raw = ssfd(i.uv0, _Surface_Stable_Fractal_Dithering_Scale / light_intensity, _Surface_Stable_Fractal_Dithering_Max_Fwidth, _Surface_Stable_Fractal_Dithering_Noise);
- float ssfd_cutoff = _Surface_Stable_Fractal_Dithering_Cutoff;
- albedo.rgb = lerp(0, 1, ssfd_raw > 1 - light_intensity);
- }
-#endif
-
#if defined(_GIMMICK_GERSTNER_WATER)
#if defined(_EXPLODE)
@@ -2359,6 +2346,8 @@ float4 effect(inout v2f i, out float depth)
//uint2 screen_uv_round = floor(tdata.screen_uv * _ScreenParams.xy * _Gimmick_Lens_00_Scale);
uint2 glasses_uv_round = floor(i.uv0 * _ScreenParams.xy * _Gimmick_Lens_00_Scale);
uint2 bayer_idx = (glasses_uv_round % 8);
+ float2 grab_uv = i.grabPos.xy / i.grabPos.w;
+ float3 grab_color = _Tooner_Grabpass.SampleLevel(linear_clamp_s, grab_uv, 0).rgb;
#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);
@@ -2366,13 +2355,15 @@ float4 effect(inout v2f i, out float depth)
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(i.uv0, _Gimmick_Lens_00_SSFD_Scale, _Gimmick_Lens_00_SSFD_Max_Fwidth, _Gimmick_Lens_00_SSFD_Noise);
- mask = mask > 0.5 ? 1 : 0;
+ float3 mask = float3(
+ ssfd(i.uv0, _Gimmick_Lens_00_SSFD_Scale / grab_color.r, _Gimmick_Lens_00_SSFD_Max_Fwidth, _Gimmick_Lens_00_SSFD_Noise),
+ ssfd(i.uv0, _Gimmick_Lens_00_SSFD_Scale / grab_color.g, _Gimmick_Lens_00_SSFD_Max_Fwidth, _Gimmick_Lens_00_SSFD_Noise),
+ ssfd(i.uv0, _Gimmick_Lens_00_SSFD_Scale / grab_color.b, _Gimmick_Lens_00_SSFD_Max_Fwidth, _Gimmick_Lens_00_SSFD_Noise)
+ );
+ mask = mask > grab_color ? 1 : 0;
#endif
- 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;
@@ -2481,6 +2472,22 @@ float4 effect(inout v2f i, out float depth)
result.rgb += getOverlayEmission(ov, i) * _Global_Emission_Factor;
result.rgb += _Global_Emission_Additive_Factor * albedo.rgb;
+#if defined(_SURFACE_STABLE_FRACTAL_DITHERING)
+ [branch]
+ if (_Surface_Stable_Fractal_Dithering_Enable_Dynamic) {
+ float3 c = result.rgb * _Surface_Stable_Fractal_Dithering_Brightness_Factor;
+ float3 mask = float3(
+ ssfd(i.uv0, _Surface_Stable_Fractal_Dithering_Scale / c.r, _Surface_Stable_Fractal_Dithering_Max_Fwidth, _Surface_Stable_Fractal_Dithering_Noise),
+ ssfd(i.uv0, _Surface_Stable_Fractal_Dithering_Scale / c.g, _Surface_Stable_Fractal_Dithering_Max_Fwidth, _Surface_Stable_Fractal_Dithering_Noise),
+ ssfd(i.uv0, _Surface_Stable_Fractal_Dithering_Scale / c.b, _Surface_Stable_Fractal_Dithering_Max_Fwidth, _Surface_Stable_Fractal_Dithering_Noise)
+ );
+
+ float3 thresholded = lerp(0, 1, mask > 1 - c * _Surface_Stable_Fractal_Dithering_Size_Factor);
+ result.rgb = lerp(result.rgb, thresholded, thresholded);
+ }
+#endif
+
+
return result;
}