From 24d1a84d2b18ee771585e22ec00fa190afde3df5 Mon Sep 17 00:00:00 2001 From: yum Date: Fri, 28 Jun 2024 17:16:03 -0700 Subject: Add quantization to rim lighting Good for artistic effect. --- Editor/tooner.cs | 5 +++++ globals.cginc | 2 ++ tooner.shader | 2 ++ tooner_lighting.cginc | 13 ++++++++++++- 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Editor/tooner.cs b/Editor/tooner.cs index 9190f0f..7063972 100644 --- a/Editor/tooner.cs +++ b/Editor/tooner.cs @@ -371,6 +371,11 @@ public class ToonerGUI : ShaderGUI { bc, "Rim lighting emission"); + bc = FindProperty($"_Rim_Lighting{i}_Quantization"); + editor.FloatProperty( + bc, + "Rim lighting quantization"); + bc = FindProperty($"_Rim_Lighting{i}_Glitter_Enabled"); enabled = bc.floatValue > 1E-6; EditorGUI.BeginChangeCheck(); diff --git a/globals.cginc b/globals.cginc index 6f7d459..e4708c0 100644 --- a/globals.cginc +++ b/globals.cginc @@ -193,6 +193,7 @@ float _Rim_Lighting0_Center; float _Rim_Lighting0_Power; float _Rim_Lighting0_Strength; float _Rim_Lighting0_Emission; +float _Rim_Lighting0_Quantization; #if defined(_RIM_LIGHTING0_GLITTER) float _Rim_Lighting0_Glitter_Enabled; float _Rim_Lighting0_Glitter_Density; @@ -212,6 +213,7 @@ float _Rim_Lighting1_Center; float _Rim_Lighting1_Power; float _Rim_Lighting1_Strength; float _Rim_Lighting1_Emission; +float _Rim_Lighting1_Quantization; #if defined(_RIM_LIGHTING1_GLITTER) float _Rim_Lighting1_Glitter_Enabled; float _Rim_Lighting1_Glitter_Density; diff --git a/tooner.shader b/tooner.shader index 938a922..b747945 100644 --- a/tooner.shader +++ b/tooner.shader @@ -150,6 +150,7 @@ Shader "yum_food/tooner" _Rim_Lighting0_Power("Rim lighting power", Float) = 2.0 _Rim_Lighting0_Strength("Rim lighting strength", Float) = 1.0 _Rim_Lighting0_Emission("Rim lighting emission", Float) = 0 + _Rim_Lighting0_Quantization("Rim lighting quantization", Float) = -1 _Rim_Lighting0_Glitter_Enabled("Rim lighting glitter", Float) = 0 _Rim_Lighting0_Glitter_Density("Rim lighting glitter density", Float) = 100 _Rim_Lighting0_Glitter_Amount("Rim lighting glitter amount", Float) = 100 @@ -165,6 +166,7 @@ Shader "yum_food/tooner" _Rim_Lighting1_Power("Rim lighting power", Float) = 2.0 _Rim_Lighting1_Strength("Rim lighting strength", Float) = 1.0 _Rim_Lighting1_Emission("Rim lighting emission", Float) = 0 + _Rim_Lighting1_Quantization("Rim lighting quantization", Float) = -1 _Rim_Lighting1_Glitter_Enabled("Rim lighting glitter", Float) = 0 _Rim_Lighting1_Glitter_Density("Rim lighting glitter density", Float) = 100 _Rim_Lighting1_Glitter_Amount("Rim lighting glitter amount", Float) = 100 diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc index 7fbe4d1..1fddfca 100644 --- a/tooner_lighting.cginc +++ b/tooner_lighting.cginc @@ -325,7 +325,10 @@ float get_glitter(float2 uv, float3 worldPos, float3 normal, float density, float amount, float speed, float mask, float brightness, float angle, float power) { - precise float idensity = rcp(density); + // A regular divide here causes flickering. The leading guess is that NVIDIA + // hardware implements the divide instruction slightly differently on + // different cores. + precise float idensity = 1.0 / density; float glitter = rand2(floor(uv * density) * idensity); float thresh = 1 - amount / 100; @@ -772,6 +775,10 @@ float4 effect(inout v2f i) { float rl = abs(theta) / PI; // on [0, 1] rl = pow(2, -_Rim_Lighting0_Power * abs(rl - _Rim_Lighting0_Center)); + float q = _Rim_Lighting0_Quantization; + if (q > -1) { + rl = floor(rl * q) / q; + } float3 matcap = rl * _Rim_Lighting0_Color * _Rim_Lighting0_Strength; #if defined(_RIM_LIGHTING0_MASK) float4 matcap_mask_raw = _Rim_Lighting0_Mask.SampleGrad(linear_repeat_s, i.uv.xy, iddx, iddy); @@ -824,6 +831,10 @@ float4 effect(inout v2f i) { float rl = abs(theta) / PI; // on [0, 1] rl = pow(2, -_Rim_Lighting1_Power * abs(rl - _Rim_Lighting1_Center)); + float q = _Rim_Lighting1_Quantization; + if (q > 0) { + rl = floor(rl * q) / q; + } float3 matcap = rl * _Rim_Lighting1_Color * _Rim_Lighting1_Strength; #if defined(_RIM_LIGHTING1_MASK) float4 matcap_mask_raw = _Rim_Lighting1_Mask.SampleGrad(linear_repeat_s, i.uv.xy, iddx, iddy); -- cgit v1.2.3