summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2024-06-28 17:16:03 -0700
committeryum <yum.food.vr@gmail.com>2024-06-28 17:16:03 -0700
commit24d1a84d2b18ee771585e22ec00fa190afde3df5 (patch)
tree2742d430fdf921a9cf453baa5024ad786b68bd77
parent1ecc426e19462909700dd86df351050a0c7468c2 (diff)
Add quantization to rim lighting
Good for artistic effect.
-rw-r--r--Editor/tooner.cs5
-rw-r--r--globals.cginc2
-rw-r--r--tooner.shader2
-rw-r--r--tooner_lighting.cginc13
4 files changed, 21 insertions, 1 deletions
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);