summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2024-06-25 19:35:35 -0700
committeryum <yum.food.vr@gmail.com>2024-06-25 19:35:35 -0700
commit312d7acc39b4dc33edd3fdc3d3d77d373b5cb198 (patch)
treec4b73a8317699055fc46d9c33b490fac8e9d8db6
parent9b1523dce73e803c822d33e2529f2836dcc8ef7f (diff)
Add glitter option to rim lighting
Now rim lighting can illuminate the avatar as if it has glitter on it. Also deprecate glitter seed, since it was unused.
-rw-r--r--Editor/tooner.cs34
-rw-r--r--feature_macros.cginc2
-rw-r--r--globals.cginc15
-rw-r--r--math.cginc4
-rw-r--r--tooner.shader10
-rw-r--r--tooner_lighting.cginc53
6 files changed, 99 insertions, 19 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs
index 33b23ac..9190f0f 100644
--- a/Editor/tooner.cs
+++ b/Editor/tooner.cs
@@ -371,6 +371,40 @@ public class ToonerGUI : ShaderGUI {
bc,
"Rim lighting emission");
+ bc = FindProperty($"_Rim_Lighting{i}_Glitter_Enabled");
+ enabled = bc.floatValue > 1E-6;
+ EditorGUI.BeginChangeCheck();
+ enabled = EditorGUILayout.Toggle("Glitter", enabled);
+ EditorGUI.EndChangeCheck();
+ bc.floatValue = enabled ? 1.0f : 0.0f;
+ SetKeyword($"_RIM_LIGHTING{i}_GLITTER", enabled);
+
+ if (enabled) {
+ EditorGUI.indentLevel += 1;
+
+ bc = FindProperty($"_Rim_Lighting{i}_Glitter_Density");
+ editor.FloatProperty(
+ bc,
+ "Density");
+
+ bc = FindProperty($"_Rim_Lighting{i}_Glitter_Amount");
+ editor.FloatProperty(
+ bc,
+ "Amount");
+
+ bc = FindProperty($"_Rim_Lighting{i}_Glitter_Speed");
+ editor.FloatProperty(
+ bc,
+ "Speed");
+
+ bc = FindProperty($"_Rim_Lighting{i}_Glitter_Quantization");
+ editor.FloatProperty(
+ bc,
+ "Quantization");
+
+ EditorGUI.indentLevel -= 1;
+ }
+
EditorGUI.indentLevel -= 1;
}
}
diff --git a/feature_macros.cginc b/feature_macros.cginc
index 5729b48..231cd5d 100644
--- a/feature_macros.cginc
+++ b/feature_macros.cginc
@@ -23,8 +23,10 @@
#pragma shader_feature_local _ _MATCAP1_MASK
#pragma shader_feature_local _ _RIM_LIGHTING0
#pragma shader_feature_local _ _RIM_LIGHTING0_MASK
+#pragma shader_feature_local _ _RIM_LIGHTING0_GLITTER
#pragma shader_feature_local _ _RIM_LIGHTING1
#pragma shader_feature_local _ _RIM_LIGHTING1_MASK
+#pragma shader_feature_local _ _RIM_LIGHTING1_GLITTER
#pragma shader_feature_local _ _OKLAB
#pragma shader_feature_local _ _CLONES
#pragma shader_feature_local _ _PBR_OVERLAY0
diff --git a/globals.cginc b/globals.cginc
index d84b216..6f7d459 100644
--- a/globals.cginc
+++ b/globals.cginc
@@ -140,7 +140,6 @@ texture2D _Glitter_Mask;
float _Glitter_Density;
float _Glitter_Amount;
float _Glitter_Speed;
-float _Glitter_Seed;
float _Glitter_Brightness;
float _Glitter_Angle;
float _Glitter_Power;
@@ -194,6 +193,13 @@ float _Rim_Lighting0_Center;
float _Rim_Lighting0_Power;
float _Rim_Lighting0_Strength;
float _Rim_Lighting0_Emission;
+#if defined(_RIM_LIGHTING0_GLITTER)
+float _Rim_Lighting0_Glitter_Enabled;
+float _Rim_Lighting0_Glitter_Density;
+float _Rim_Lighting0_Glitter_Amount;
+float _Rim_Lighting0_Glitter_Speed;
+float _Rim_Lighting0_Glitter_Quantization;
+#endif
#endif
#if defined(_RIM_LIGHTING1)
@@ -206,6 +212,13 @@ float _Rim_Lighting1_Center;
float _Rim_Lighting1_Power;
float _Rim_Lighting1_Strength;
float _Rim_Lighting1_Emission;
+#if defined(_RIM_LIGHTING1_GLITTER)
+float _Rim_Lighting1_Glitter_Enabled;
+float _Rim_Lighting1_Glitter_Density;
+float _Rim_Lighting1_Glitter_Amount;
+float _Rim_Lighting1_Glitter_Speed;
+float _Rim_Lighting1_Glitter_Quantization;
+#endif
#endif
#if defined(_OKLAB)
diff --git a/math.cginc b/math.cginc
index 747c5c2..59e6fa0 100644
--- a/math.cginc
+++ b/math.cginc
@@ -51,7 +51,9 @@ float rand(uint seed) {
// Generate a random number on [0, 1].
float rand2(float2 p)
{
- return glsl_mod(sin(dot(p, float2(561.0, 885.0))) * 776.2, 1.0);
+ return frac(sin(dot(p,
+ float2(12.9898, 78.233)))
+ * 43758.5453123);
}
// Generate a random number on [0, 1].
diff --git a/tooner.shader b/tooner.shader
index c48f728..938a922 100644
--- a/tooner.shader
+++ b/tooner.shader
@@ -150,6 +150,11 @@ 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_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
+ _Rim_Lighting0_Glitter_Speed("Rim lighting glitter speed", Float) = 1
+ _Rim_Lighting0_Glitter_Quantization("Rim lighting glitter quantization", Float) = 1000
_Rim_Lighting1_Enabled("Enable rim lighting", Float) = 0
_Rim_Lighting1_Mode("Rim lighting mode", Float) = 0
@@ -160,6 +165,11 @@ 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_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
+ _Rim_Lighting1_Glitter_Speed("Rim lighting glitter speed", Float) = 1
+ _Rim_Lighting1_Glitter_Quantization("Rim lighting glitter quantization", Float) = 1000
_OKLAB_Enabled("Enable OKLAB", Float) = 0.0
_OKLAB_Mask("Mask", 2D) = "white" {}
diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc
index 2c07b8f..cc5d28d 100644
--- a/tooner_lighting.cginc
+++ b/tooner_lighting.cginc
@@ -1,8 +1,6 @@
#ifndef TOONER_LIGHTING
#define TOONER_LIGHTING
-#include "pbr.cginc"
-
#include "audiolink.cginc"
#include "clones.cginc"
#include "globals.cginc"
@@ -10,6 +8,7 @@
#include "iq_sdf.cginc"
#include "math.cginc"
#include "motion.cginc"
+#include "pbr.cginc"
#include "poi.cginc"
#include "shadertoy.cginc"
#include "tooner_scroll.cginc"
@@ -70,7 +69,7 @@ v2f vert(appdata v)
o.normal = UnityObjectToWorldNormal(v.normal);
o.tangent = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
- o.uv = v.uv0.xy;
+ o.uv = v.uv0;
#if defined(LIGHTMAP_ON)
o.lmuv = v.uv1 * unity_LightmapST.xy + unity_LightmapST.zw;
#endif
@@ -321,32 +320,33 @@ void geom(triangle v2f tri_in[3],
tri_out.RestartStrip();
}
-#if defined(_GLITTER)
-float get_glitter(float2 uv, float iddx, float iddy, float3 worldPos, float3 normal)
+#if defined(_GLITTER) || defined(_RIM_LIGHTING0_GLITTER) || defined(_RIM_LIGHTING1_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 pixellate = _Glitter_Density;
- float glitter = rand2(round(uv * pixellate) / pixellate + _Glitter_Seed);
+ uint2 uv_q = (uint2) floor(uv * density);
+ // rand2 is noisy and shitty
+ float glitter = (float) rand((uv_q.x * 997) ^ (uv_q.y * 991));
- float thresh = 1 - _Glitter_Amount / 100;
+ float thresh = 1 - amount / 100;
glitter = lerp(0, glitter, glitter > thresh);
glitter = (glitter - thresh) / (1 - thresh);
- float b = sin(_Time[2] * _Glitter_Speed / 2 + glitter*100);
+ float b = sin(_Time[2] * speed / 2 + glitter*100);
+ b = speed > 1E-6 ? b : 1;
glitter = max(glitter, 0)*max(b, 0);
- float mask = _Glitter_Mask.SampleGrad(linear_repeat_s, uv, iddx, iddy);
glitter *= mask;
glitter = clamp(glitter, 0, 1);
- glitter *= _Glitter_Brightness;
+ glitter *= brightness;
- if (_Glitter_Angle < 90) {
+ if (angle < 90) {
float ndotl = abs(dot(normal, normalize(_WorldSpaceCameraPos.xyz - worldPos)));
- float cutoff = cos((_Glitter_Angle / 180) * 3.14159);
-
- glitter *= saturate(pow(ndotl / cutoff, _Glitter_Power));
+ float cutoff = cos((angle / 180) * 3.14159);
- //glitter = ndotl > cutoff ? glitter : 0;
+ glitter *= saturate(pow(ndotl / cutoff, power));
}
return glitter;
@@ -782,6 +782,14 @@ float4 effect(inout v2f i)
#else
float matcap_mask = 1;
#endif
+#if defined(_RIM_LIGHTING0_GLITTER)
+ float rl_glitter = get_glitter(i.uv.xy, i.worldPos, normal,
+ _Rim_Lighting0_Glitter_Density,
+ _Rim_Lighting0_Glitter_Amount, _Rim_Lighting0_Glitter_Speed,
+ /*mask=*/1, /*brightness=*/1, /*angle=*/91, /*power=*/1);
+ rl_glitter = floor(rl_glitter * _Rim_Lighting0_Glitter_Quantization) / _Rim_Lighting0_Glitter_Quantization;
+ matcap_mask *= rl_glitter;
+#endif
int mode = round(_Rim_Lighting0_Mode);
switch (mode) {
case 0:
@@ -826,6 +834,14 @@ float4 effect(inout v2f i)
#else
float matcap_mask = 1;
#endif
+#if defined(_RIM_LIGHTING1_GLITTER)
+ float rl_glitter = get_glitter(i.uv, i.worldPos, normal,
+ _Rim_Lighting1_Glitter_Density,
+ _Rim_Lighting1_Glitter_Amount, _Rim_Lighting1_Glitter_Speed,
+ /*mask=*/1, /*brightness=*/1, /*angle=*/91, /*power=*/1);
+ rl_glitter = floor(rl_glitter * _Rim_Lighting1_Glitter_Quantization) / _Rim_Lighting1_Glitter_Quantization;
+ matcap_mask *= rl_glitter;
+#endif
int mode = round(_Rim_Lighting1_Mode);
switch (mode) {
case 0:
@@ -916,7 +932,10 @@ float4 effect(inout v2f i)
result.rgb += matcap_emission;
#endif
#if defined(_GLITTER)
- float glitter = get_glitter(i.uv, iddx, iddy, i.worldPos, normal);
+ float glitter_mask = _Glitter_Mask.SampleGrad(linear_repeat_s, i.uv, iddx, iddy);
+ float glitter = get_glitter(i.uv, i.worldPos, normal,
+ _Glitter_Density, _Glitter_Amount, _Glitter_Speed,
+ glitter_mask, _Glitter_Brightness, _Glitter_Angle, _Glitter_Power);
result.rgb += glitter;
#endif
#if defined(_EMISSION)