summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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)