summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2024-08-30 14:24:59 -0700
committeryum <yum.food.vr@gmail.com>2024-08-30 14:24:59 -0700
commit2ea62b8fc899cab47e6e23da9168a42ecd6ddf45 (patch)
treec42724bf73ab60dfc00f308815bb291f70b41d63
parentc72069f69f451a4e369f01ac3dac3961740127b5 (diff)
Add lit glitter logic
Also fix prox dimming. It should occur *after* the non-specular brightness budget correction.
-rw-r--r--Editor/tooner.cs7
-rw-r--r--globals.cginc1
-rw-r--r--pbr.cginc30
-rw-r--r--tooner.shader3
-rw-r--r--tooner_lighting.cginc34
5 files changed, 45 insertions, 30 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs
index 74dcae7..741bd5f 100644
--- a/Editor/tooner.cs
+++ b/Editor/tooner.cs
@@ -951,10 +951,15 @@ public class ToonerGUI : ShaderGUI {
bc,
"Speed");
+ bc = FindProperty("_Glitter_Brightness_Lit");
+ editor.FloatProperty(
+ bc,
+ "Brightness (lit)");
+
bc = FindProperty("_Glitter_Brightness");
editor.FloatProperty(
bc,
- "Brightness");
+ "Brightness (unlit)");
bc = FindProperty("_Glitter_Angle");
editor.FloatProperty(
diff --git a/globals.cginc b/globals.cginc
index 7ec2cd0..0a95482 100644
--- a/globals.cginc
+++ b/globals.cginc
@@ -293,6 +293,7 @@ float _Glitter_Density;
float _Glitter_Amount;
float _Glitter_Speed;
float _Glitter_Brightness;
+float _Glitter_Brightness_Lit;
float _Glitter_Angle;
float _Glitter_Power;
float _Glitter_UV_Select;
diff --git a/pbr.cginc b/pbr.cginc
index 4750838..9f5600d 100644
--- a/pbr.cginc
+++ b/pbr.cginc
@@ -256,14 +256,28 @@ float4 getLitColor(
indirect_light.diffuse[1] *= _Reflection_Probe_Saturation;
}
+ float2 brightnesses = float2(
+ direct_light.color[2],
+ indirect_light.diffuse[2]);
+ // Do this to avoid division by 0. If both light sources are black,
+ // sum_brightness could be 0;
+ brightnesses = max(brightnesses, min(_Min_Brightness, .001));
+ float sum_brightness = brightnesses[0] + brightnesses[1];
+ float2 brightness_proportions = brightnesses / sum_brightness;
+ sum_brightness = clamp(sum_brightness, _Min_Brightness, _Max_Brightness);
+ direct_light.color[2] = sum_brightness * brightness_proportions[0];
+ indirect_light.diffuse[2] = sum_brightness * brightness_proportions[1];
+
#if defined(_PROXIMITY_DIMMING)
{
float cam_dist = length(_WorldSpaceCameraPos - worldPos);
+ // Map onto [min, max]
cam_dist = clamp(cam_dist, _Proximity_Dimming_Min_Dist,
_Proximity_Dimming_Max_Dist);
+ // Map onto [0, max - min]
+ cam_dist -= _Proximity_Dimming_Min_Dist;
// Map onto [0, 1]
- cam_dist = (cam_dist - _Proximity_Dimming_Min_Dist) /
- (_Proximity_Dimming_Max_Dist - _Proximity_Dimming_Min_Dist);
+ cam_dist /= _Proximity_Dimming_Max_Dist - _Proximity_Dimming_Min_Dist;
float dim_factor = lerp(_Proximity_Dimming_Factor, 1, cam_dist);
direct_light.color[2] *= dim_factor;
indirect_light.diffuse[2] *= dim_factor;
@@ -271,18 +285,6 @@ float4 getLitColor(
}
#endif
- float2 brightnesses = float2(
- direct_light.color[2],
- indirect_light.diffuse[2]);
- // Do this to avoid division by 0. If both light sources are black,
- // sum_brightness could be 0;
- brightnesses = max(brightnesses, min(_Min_Brightness, .001));
- float sum_brightness = brightnesses[0] + brightnesses[1];
- float2 brightness_proportions = brightnesses / sum_brightness;
- sum_brightness = clamp(sum_brightness, _Min_Brightness, _Max_Brightness);
- direct_light.color[2] = sum_brightness * brightness_proportions[0];
- indirect_light.diffuse[2] = sum_brightness * brightness_proportions[1];
-
direct_light.color[2] *= _Lighting_Factor * _Direct_Lighting_Factor * enable_direct;
indirect_light.specular[2] *= _Lighting_Factor *
_Indirect_Specular_Lighting_Factor *
diff --git a/tooner.shader b/tooner.shader
index c65a519..227131d 100644
--- a/tooner.shader
+++ b/tooner.shader
@@ -202,7 +202,8 @@ Shader "yum_food/tooner"
_Glitter_Amount("Glitter amount", Range(1, 100)) = 35
_Glitter_Speed("Glitter speed", float) = 1
_Glitter_Seed("Glitter seed", float) = 1
- _Glitter_Brightness("Glitter brightness", float) = 1
+ _Glitter_Brightness("Glitter brightness (unlit)", float) = 1
+ _Glitter_Brightness_Lit("Glitter brightness (lit)", float) = 0
_Glitter_Angle("Glitter angle", Range(0, 90)) = 90
_Glitter_Power("Glitter power", float) = 30
_Glitter_UV_Select("Glitter UV channel", Range(0, 7)) = 0
diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc
index 55bf8c7..4ca10da 100644
--- a/tooner_lighting.cginc
+++ b/tooner_lighting.cginc
@@ -360,7 +360,7 @@ void geom(triangle v2f tri_in[3],
#if defined(_GLITTER) || defined(_RIM_LIGHTING0_GLITTER) || defined(_RIM_LIGHTING1_GLITTER) || defined(_RIM_LIGHTING2_GLITTER) || defined(_RIM_LIGHTING3_GLITTER)
float get_glitter(float2 uv, float3 worldPos,
float3 normal, float density, float amount, float speed,
- float mask, float brightness, float angle, float power)
+ float mask, float angle, float power)
{
// A regular divide here causes flickering. The leading guess is that NVIDIA
// hardware implements the divide instruction slightly differently on
@@ -379,7 +379,6 @@ float get_glitter(float2 uv, float3 worldPos,
glitter *= mask;
glitter = clamp(glitter, 0, 1);
- glitter *= brightness;
if (angle < 90) {
float ndotl = abs(dot(normal, normalize(_WorldSpaceCameraPos.xyz - worldPos)));
@@ -1493,7 +1492,7 @@ float4 effect(inout v2f i)
i.worldPos, normal,
_Rim_Lighting0_Glitter_Density,
_Rim_Lighting0_Glitter_Amount, _Rim_Lighting0_Glitter_Speed,
- /*mask=*/1, /*brightness=*/1, /*angle=*/91, /*power=*/1);
+ /*mask=*/1, /*angle=*/91, /*power=*/1);
rl_glitter = floor(rl_glitter * _Rim_Lighting0_Glitter_Quantization) / _Rim_Lighting0_Glitter_Quantization;
matcap_mask *= rl_glitter;
#endif
@@ -1573,7 +1572,7 @@ float4 effect(inout v2f i)
i.worldPos, normal,
_Rim_Lighting1_Glitter_Density,
_Rim_Lighting1_Glitter_Amount, _Rim_Lighting1_Glitter_Speed,
- /*mask=*/1, /*brightness=*/1, /*angle=*/91, /*power=*/1);
+ /*mask=*/1, /*angle=*/91, /*power=*/1);
rl_glitter = floor(rl_glitter * _Rim_Lighting1_Glitter_Quantization) / _Rim_Lighting1_Glitter_Quantization;
matcap_mask *= rl_glitter;
#endif
@@ -1653,7 +1652,7 @@ float4 effect(inout v2f i)
i.worldPos, normal,
_Rim_Lighting2_Glitter_Density,
_Rim_Lighting2_Glitter_Amount, _Rim_Lighting2_Glitter_Speed,
- /*mask=*/1, /*brightness=*/1, /*angle=*/91, /*power=*/1);
+ /*mask=*/1, /*angle=*/91, /*power=*/1);
rl_glitter = floor(rl_glitter * _Rim_Lighting2_Glitter_Quantization) / _Rim_Lighting2_Glitter_Quantization;
matcap_mask *= rl_glitter;
#endif
@@ -1733,7 +1732,7 @@ float4 effect(inout v2f i)
i.worldPos, normal,
_Rim_Lighting3_Glitter_Density,
_Rim_Lighting3_Glitter_Amount, _Rim_Lighting3_Glitter_Speed,
- /*mask=*/1, /*brightness=*/1, /*angle=*/91, /*power=*/1);
+ /*mask=*/1, /*angle=*/91, /*power=*/1);
rl_glitter = floor(rl_glitter * _Rim_Lighting3_Glitter_Quantization) / _Rim_Lighting3_Glitter_Quantization;
matcap_mask *= rl_glitter;
#endif
@@ -1847,6 +1846,20 @@ float4 effect(inout v2f i)
normal = i.normal;
}
#endif
+#if defined(_GLITTER)
+ float3 glitter_color_unlit;
+ {
+ float glitter_mask = _Glitter_Mask.SampleBias(linear_repeat_s, i.uv0, _Global_Sample_Bias);
+ glitter_mask *= min(matcap_overwrite_mask[0], matcap_overwrite_mask[1]);
+ float glitter = get_glitter(
+ get_uv_by_channel(i, round(_Glitter_UV_Select)),
+ i.worldPos, normal,
+ _Glitter_Density, _Glitter_Amount, _Glitter_Speed,
+ glitter_mask, _Glitter_Angle, _Glitter_Power);
+ glitter_color_unlit = glitter * _Glitter_Color;
+ }
+ albedo.rgb += glitter_color_unlit * _Glitter_Brightness_Lit;
+#endif
float4 lit = getLitColor(vertex_light_color, albedo, i.worldPos, normal,
metallic, 1.0 - roughness, i.uv0, ao, /*enable_direct=*/true, i);
@@ -1875,14 +1888,7 @@ float4 effect(inout v2f i)
result.rgb += decal_emission * _Global_Emission_Factor;
#endif
#if defined(_GLITTER)
- float glitter_mask = _Glitter_Mask.SampleBias(linear_repeat_s, i.uv0, _Global_Sample_Bias);
- glitter_mask *= min(matcap_overwrite_mask[0], matcap_overwrite_mask[1]);
- float glitter = get_glitter(
- get_uv_by_channel(i, round(_Glitter_UV_Select)),
- i.worldPos, normal,
- _Glitter_Density, _Glitter_Amount, _Glitter_Speed,
- glitter_mask, _Glitter_Brightness, _Glitter_Angle, _Glitter_Power);
- result.rgb += glitter * _Glitter_Color;
+ result.rgb += glitter_color_unlit * _Glitter_Brightness;
#endif
#if defined(_EMISSION0)
{