From 2ea62b8fc899cab47e6e23da9168a42ecd6ddf45 Mon Sep 17 00:00:00 2001 From: yum Date: Fri, 30 Aug 2024 14:24:59 -0700 Subject: Add lit glitter logic Also fix prox dimming. It should occur *after* the non-specular brightness budget correction. --- Editor/tooner.cs | 7 ++++++- globals.cginc | 1 + pbr.cginc | 30 ++++++++++++++++-------------- tooner.shader | 3 ++- tooner_lighting.cginc | 34 ++++++++++++++++++++-------------- 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) { -- cgit v1.2.3