diff options
| author | yum <yum.food.vr@gmail.com> | 2024-10-09 08:06:53 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2024-10-09 08:25:45 -0700 |
| commit | e193c86c869b84dfaaa26465c0e6fb923a27631c (patch) | |
| tree | 025d7d94bac4abcec8d4479dbc95947216bda481 | |
| parent | c22c911ea360b0f9bdd9ee6ccd735fbcfe3bfad6 (diff) | |
Rework step size / density
Step size is now derived from density. Step size is reimagined as a
"quality" multiplier.
| -rw-r--r-- | Editor/tooner.cs | 4 | ||||
| -rw-r--r-- | fog.cginc | 20 | ||||
| -rw-r--r-- | globals.cginc | 2 | ||||
| -rw-r--r-- | pbr.cginc | 3 | ||||
| -rw-r--r-- | tooner.shader | 2 | ||||
| -rw-r--r-- | tooner_lighting.cginc | 5 | ||||
| -rw-r--r-- | tooner_outline_pass.cginc | 3 |
7 files changed, 25 insertions, 14 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs index 9f689aa..fdcb678 100644 --- a/Editor/tooner.cs +++ b/Editor/tooner.cs @@ -2023,8 +2023,8 @@ public class ToonerGUI : ShaderGUI { RangeProperty(bc, "Density"); bc = FindProperty("_Gimmick_Fog_00_Radius"); FloatProperty(bc, "Radius"); - bc = FindProperty("_Gimmick_Fog_00_Step_Size"); - FloatProperty(bc, "Step size"); + bc = FindProperty("_Gimmick_Fog_00_Step_Size_Factor"); + FloatProperty(bc, "Step size multiplier"); bc = FindProperty("_Gimmick_Fog_00_Max_Ray"); FloatProperty(bc, "Max ray length (m)"); bc = FindProperty("_Gimmick_Fog_00_Noise_Scale"); @@ -12,6 +12,7 @@ struct Fog00PBR { float4 albedo; float3 normal; + float3 diffuse; float depth; float ao; }; @@ -95,26 +96,28 @@ Fog00PBR getFog00(v2f i) { // Factor of 10 on `screen_uv*10` eliminates visible striping artifact that // is visible with no factor. - float dither = rand2(screen_uv*10) * _Gimmick_Fog_00_Step_Size * _Gimmick_Fog_00_Ray_Origin_Randomization; + float step_size = rcp(_Gimmick_Fog_00_Density) * _Gimmick_Fog_00_Step_Size_Factor; + step_size = clamp(step_size, 1E-2, 10); + float dither = rand2(screen_uv*10) * step_size * _Gimmick_Fog_00_Ray_Origin_Randomization; ro += rd * (0.1 + dither); float world_pos_depth_hit_l = length(world_pos_depth_hit - ro); float4 acc = 0; uint step_count = floor(min( - _Gimmick_Fog_00_Max_Ray / _Gimmick_Fog_00_Step_Size, - world_pos_depth_hit_l / _Gimmick_Fog_00_Step_Size)); + _Gimmick_Fog_00_Max_Ray / step_size, + world_pos_depth_hit_l / step_size)); step_count *= (1 - no_intersection); float3 normal = i.normal; float ao = 0; for (uint ii = 0; ii < step_count; ii++) { - float3 p = ro + (rd * _Gimmick_Fog_00_Step_Size) * ii; + float3 p = ro + (rd * step_size) * ii; - float col_gray = 0.3; + const float col_gray = 0; const float map_p = map(p); float4 c = float4(col_gray, col_gray, col_gray, map_p); - c.a = saturate(c.a * _Gimmick_Fog_00_Density * _Gimmick_Fog_00_Step_Size); + c.a = saturate(c.a * _Gimmick_Fog_00_Density * step_size); #if defined(_GIMMICK_FOG_00_EMITTER_TEXTURE) // Project onto plane @@ -150,11 +153,13 @@ Fog00PBR getFog00(v2f i) { ao = cur_ao * (1.0 - acc.a) + acc.a * ao; // Performance hack: stop blending normals after enough accumulation. +#if 0 if (acc.a < _Gimmick_Fog_00_Normal_Cutoff) { float3 n = get_normal(p, map_p); float n_interp = saturate(c.a * (1.0 - acc.a) * rcp(_Gimmick_Fog_00_Normal_Cutoff)); normal = MY_BLEND_NORMALS(normal, n, n_interp); } +#endif if (acc.a > _Gimmick_Fog_00_Albedo_Cutoff) { acc /= acc.a; break; @@ -166,9 +171,10 @@ Fog00PBR getFog00(v2f i) { } Fog00PBR pbr; - pbr.albedo.rgb = acc.rgb; + pbr.albedo.rgb = 1; pbr.albedo.a = saturate(acc.a); pbr.ao = ao; + pbr.diffuse = acc.rgb; #if 1 pbr.normal = normalize(normal); diff --git a/globals.cginc b/globals.cginc index b4b0c84..e76cc4f 100644 --- a/globals.cginc +++ b/globals.cginc @@ -708,7 +708,7 @@ float _Gimmick_AL_Chroma_00_Hue_Shift_Theta; #if defined(_GIMMICK_FOG_00) float _Gimmick_Fog_00_Max_Ray; float _Gimmick_Fog_00_Radius; -float _Gimmick_Fog_00_Step_Size; +float _Gimmick_Fog_00_Step_Size_Factor; float _Gimmick_Fog_00_Noise_Scale; float _Gimmick_Fog_00_Noise_Exponent; float _Gimmick_Fog_00_Density; @@ -192,6 +192,7 @@ float4 getLitColor( float ao, // hack while i figure out view-dependent flickering in outlines bool enable_direct, + float3 diffuse_contrib, v2f i) { float3 specular_tint; @@ -243,7 +244,7 @@ float4 getLitColor( #else direct_light.color = getDirectLightColor(); #endif - indirect_light.diffuse = getIndirectDiffuse(i, vertexLightColor, normal); + indirect_light.diffuse = getIndirectDiffuse(i, vertexLightColor, normal) + diffuse_contrib; indirect_light.specular = getIndirectSpecular(i, view_dir, normal, smoothness, metallic, worldPos, uv); } diff --git a/tooner.shader b/tooner.shader index 820d466..d3999e9 100644 --- a/tooner.shader +++ b/tooner.shader @@ -621,7 +621,7 @@ Shader "yum_food/tooner" _Gimmick_Fog_00_Enable_Static("Enable fog 00", Float) = 0 _Gimmick_Fog_00_Max_Ray("Max ray", Float) = 25 _Gimmick_Fog_00_Radius("Radius", Float) = 25 - _Gimmick_Fog_00_Step_Size("Step size (meters)", Float) = 1 + _Gimmick_Fog_00_Step_Size_Factor("Step size (meters)", Float) = 1 _Gimmick_Fog_00_Noise_Scale("Noise scale", Float) = 1 _Gimmick_Fog_00_Noise_Exponent("Noise exponent", Float) = 2.0 _Gimmick_Fog_00_Density("Density", Range(0,2)) = 1.0 diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc index 325ccb3..093a5af 100644 --- a/tooner_lighting.cginc +++ b/tooner_lighting.cginc @@ -2198,6 +2198,7 @@ float4 effect(inout v2f i, out float depth) float ao = 1; #endif + float3 diffuse_contrib = 0; #if defined(_GIMMICK_FOG_00) { Fog00PBR pbr = getFog00(i); @@ -2205,6 +2206,7 @@ float4 effect(inout v2f i, out float depth) normal = pbr.normal; ao = pbr.ao; depth = pbr.depth; + diffuse_contrib += pbr.diffuse; } #endif @@ -2232,7 +2234,8 @@ float4 effect(inout v2f i, out float depth) #endif float4 lit = getLitColor(vertex_light_color, albedo, i.worldPos, normal, - metallic, 1.0 - roughness, i.uv0, ao, /*enable_direct=*/true, i); + metallic, 1.0 - roughness, i.uv0, ao, /*enable_direct=*/true, + diffuse_contrib, i); #if defined(_GIMMICK_FLAT_COLOR) if (round(_Gimmick_Flat_Color_Enable_Dynamic)) { diff --git a/tooner_outline_pass.cginc b/tooner_outline_pass.cginc index 960039e..9c10999 100644 --- a/tooner_outline_pass.cginc +++ b/tooner_outline_pass.cginc @@ -316,7 +316,8 @@ fixed4 frag (v2f i) : SV_Target vertex_light_color, albedo, i.worldPos, i.normal, /*metallic=*/0, /*smoothness=*/0, - i.uv0, ao, /*enable_direct=*/false, i); + i.uv0, ao, /*enable_direct=*/false, + /*diffuse_contrib=*/0, i); result += albedo * _Outline_Emission_Strength; #if defined(_GIMMICK_AL_CHROMA_00) |
