summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2024-10-09 08:06:53 -0700
committeryum <yum.food.vr@gmail.com>2024-10-09 08:25:45 -0700
commite193c86c869b84dfaaa26465c0e6fb923a27631c (patch)
tree025d7d94bac4abcec8d4479dbc95947216bda481
parentc22c911ea360b0f9bdd9ee6ccd735fbcfe3bfad6 (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.cs4
-rw-r--r--fog.cginc20
-rw-r--r--globals.cginc2
-rw-r--r--pbr.cginc3
-rw-r--r--tooner.shader2
-rw-r--r--tooner_lighting.cginc5
-rw-r--r--tooner_outline_pass.cginc3
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");
diff --git a/fog.cginc b/fog.cginc
index 6635ab7..f31a7d3 100644
--- a/fog.cginc
+++ b/fog.cginc
@@ -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;
diff --git a/pbr.cginc b/pbr.cginc
index 9dad53f..c53a156 100644
--- a/pbr.cginc
+++ b/pbr.cginc
@@ -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)