diff options
| author | yum <yum.food.vr@gmail.com> | 2024-06-25 19:35:35 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2024-06-25 19:35:35 -0700 |
| commit | 312d7acc39b4dc33edd3fdc3d3d77d373b5cb198 (patch) | |
| tree | c4b73a8317699055fc46d9c33b490fac8e9d8db6 | |
| parent | 9b1523dce73e803c822d33e2529f2836dcc8ef7f (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.cs | 34 | ||||
| -rw-r--r-- | feature_macros.cginc | 2 | ||||
| -rw-r--r-- | globals.cginc | 15 | ||||
| -rw-r--r-- | math.cginc | 4 | ||||
| -rw-r--r-- | tooner.shader | 10 | ||||
| -rw-r--r-- | tooner_lighting.cginc | 53 |
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) @@ -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) |
