diff options
| author | yum <yum.food.vr@gmail.com> | 2024-08-10 17:08:39 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2024-08-10 17:08:39 -0700 |
| commit | bcba7f9bdb8a12314eff05f666b2c6e01d4d5818 (patch) | |
| tree | daa6d9b87e9480db1923ab707661c46a0747e4bd | |
| parent | 7ce783162a9be36c5e75c90d347bcf65182598c4 (diff) | |
Add two more rim lighting slots
| -rw-r--r-- | Editor/tooner.cs | 2 | ||||
| -rw-r--r-- | feature_macros.cginc | 8 | ||||
| -rw-r--r-- | globals.cginc | 50 | ||||
| -rw-r--r-- | tooner.shader | 38 | ||||
| -rw-r--r-- | tooner_lighting.cginc | 146 |
5 files changed, 237 insertions, 7 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs index 4623e9f..7610e5b 100644 --- a/Editor/tooner.cs +++ b/Editor/tooner.cs @@ -500,7 +500,7 @@ public class ToonerGUI : ShaderGUI { } void DoRimLighting() { - for (int i = 0; i < 2; i++) { + for (int i = 0; i < 4; i++) { GUILayout.Label($"Rim lighting {i}", EditorStyles.boldLabel); EditorGUI.indentLevel += 1; diff --git a/feature_macros.cginc b/feature_macros.cginc index 22e248c..2903d2b 100644 --- a/feature_macros.cginc +++ b/feature_macros.cginc @@ -31,6 +31,14 @@ #pragma shader_feature_local _ _RIM_LIGHTING1_MASK #pragma shader_feature_local _ _RIM_LIGHTING1_GLITTER #pragma shader_feature_local _ _RIM_LIGHTING1_POLAR_MASK +#pragma shader_feature_local _ _RIM_LIGHTING2 +#pragma shader_feature_local _ _RIM_LIGHTING2_MASK +#pragma shader_feature_local _ _RIM_LIGHTING2_GLITTER +#pragma shader_feature_local _ _RIM_LIGHTING2_POLAR_MASK +#pragma shader_feature_local _ _RIM_LIGHTING3 +#pragma shader_feature_local _ _RIM_LIGHTING3_MASK +#pragma shader_feature_local _ _RIM_LIGHTING3_GLITTER +#pragma shader_feature_local _ _RIM_LIGHTING3_POLAR_MASK #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 d607755..497e52b 100644 --- a/globals.cginc +++ b/globals.cginc @@ -366,6 +366,56 @@ float _Rim_Lighting1_PolarMask_Power; #endif #endif +#if defined(_RIM_LIGHTING2) +float _Rim_Lighting2_Enabled; +float _Rim_Lighting2_Mode; +float3 _Rim_Lighting2_Color; +texture2D _Rim_Lighting2_Mask; +float _Rim_Lighting2_Mask_Invert; +float _Rim_Lighting2_Center; +float _Rim_Lighting2_Power; +float _Rim_Lighting2_Strength; +float _Rim_Lighting2_Emission; +float _Rim_Lighting2_Quantization; +#if defined(_RIM_LIGHTING2_GLITTER) +float _Rim_Lighting2_Glitter_Enabled; +float _Rim_Lighting2_Glitter_Density; +float _Rim_Lighting2_Glitter_Amount; +float _Rim_Lighting2_Glitter_Speed; +float _Rim_Lighting2_Glitter_Quantization; +#endif +#if defined(_RIM_LIGHTING2_POLAR_MASK) +float _Rim_Lighting2_PolarMask_Enabled; +float _Rim_Lighting2_PolarMask_Theta; +float _Rim_Lighting2_PolarMask_Power; +#endif +#endif + +#if defined(_RIM_LIGHTING3) +float _Rim_Lighting3_Enabled; +float _Rim_Lighting3_Mode; +float3 _Rim_Lighting3_Color; +texture2D _Rim_Lighting3_Mask; +float _Rim_Lighting3_Mask_Invert; +float _Rim_Lighting3_Center; +float _Rim_Lighting3_Power; +float _Rim_Lighting3_Strength; +float _Rim_Lighting3_Emission; +float _Rim_Lighting3_Quantization; +#if defined(_RIM_LIGHTING3_GLITTER) +float _Rim_Lighting3_Glitter_Enabled; +float _Rim_Lighting3_Glitter_Density; +float _Rim_Lighting3_Glitter_Amount; +float _Rim_Lighting3_Glitter_Speed; +float _Rim_Lighting3_Glitter_Quantization; +#endif +#if defined(_RIM_LIGHTING3_POLAR_MASK) +float _Rim_Lighting3_PolarMask_Enabled; +float _Rim_Lighting3_PolarMask_Theta; +float _Rim_Lighting3_PolarMask_Power; +#endif +#endif + #if defined(_OKLAB) float _OKLAB_Enabled; texture2D _OKLAB_Mask; diff --git a/tooner.shader b/tooner.shader index 06c34e6..abdec1a 100644 --- a/tooner.shader +++ b/tooner.shader @@ -265,6 +265,44 @@ Shader "yum_food/tooner" _Rim_Lighting1_PolarMask_Theta("Rim lighting polar mask - theta", Float) = 0 _Rim_Lighting1_PolarMask_Power("Rim lighting polar mask - power", Float) = 3 + _Rim_Lighting2_Enabled("Enable rim lighting", Float) = 0 + _Rim_Lighting2_Mode("Rim lighting mode", Float) = 0 + _Rim_Lighting2_Mask("Rim lighting mask", 2D) = "white" {} + _Rim_Lighting2_Mask_Invert("Invert rim lighting mask", Float) = 0.0 + _Rim_Lighting2_Color("Rim lighting color", Color) = (1, 1, 1, 1) + _Rim_Lighting2_Center("Rim lighting center", Float) = 0.5 + _Rim_Lighting2_Power("Rim lighting power", Float) = 2.0 + _Rim_Lighting2_Strength("Rim lighting strength", Float) = 1.0 + _Rim_Lighting2_Emission("Rim lighting emission", Float) = 0 + _Rim_Lighting2_Quantization("Rim lighting quantization", Float) = -1 + _Rim_Lighting2_Glitter_Enabled("Rim lighting glitter", Float) = 0 + _Rim_Lighting2_Glitter_Density("Rim lighting glitter density", Float) = 100 + _Rim_Lighting2_Glitter_Amount("Rim lighting glitter amount", Float) = 100 + _Rim_Lighting2_Glitter_Speed("Rim lighting glitter speed", Float) = 1 + _Rim_Lighting2_Glitter_Quantization("Rim lighting glitter quantization", Float) = 1000 + _Rim_Lighting2_PolarMask_Enabled("Rim lighting polar mask enabled", Float) = 0 + _Rim_Lighting2_PolarMask_Theta("Rim lighting polar mask - theta", Float) = 0 + _Rim_Lighting2_PolarMask_Power("Rim lighting polar mask - power", Float) = 3 + + _Rim_Lighting3_Enabled("Enable rim lighting", Float) = 0 + _Rim_Lighting3_Mode("Rim lighting mode", Float) = 0 + _Rim_Lighting3_Mask("Rim lighting mask", 2D) = "white" {} + _Rim_Lighting3_Mask_Invert("Invert rim lighting mask", Float) = 0.0 + _Rim_Lighting3_Color("Rim lighting color", Color) = (1, 1, 1, 1) + _Rim_Lighting3_Center("Rim lighting center", Float) = 0.5 + _Rim_Lighting3_Power("Rim lighting power", Float) = 2.0 + _Rim_Lighting3_Strength("Rim lighting strength", Float) = 1.0 + _Rim_Lighting3_Emission("Rim lighting emission", Float) = 0 + _Rim_Lighting3_Quantization("Rim lighting quantization", Float) = -1 + _Rim_Lighting3_Glitter_Enabled("Rim lighting glitter", Float) = 0 + _Rim_Lighting3_Glitter_Density("Rim lighting glitter density", Float) = 100 + _Rim_Lighting3_Glitter_Amount("Rim lighting glitter amount", Float) = 100 + _Rim_Lighting3_Glitter_Speed("Rim lighting glitter speed", Float) = 1 + _Rim_Lighting3_Glitter_Quantization("Rim lighting glitter quantization", Float) = 1000 + _Rim_Lighting3_PolarMask_Enabled("Rim lighting polar mask enabled", Float) = 0 + _Rim_Lighting3_PolarMask_Theta("Rim lighting polar mask - theta", Float) = 0 + _Rim_Lighting3_PolarMask_Power("Rim lighting polar mask - power", Float) = 3 + _OKLAB_Enabled("Enable OKLAB", Float) = 0.0 _OKLAB_Mask("Mask", 2D) = "white" {} _OKLAB_Mask_Invert("Mask invert", Float) = 0.0 diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc index 41975bc..631f911 100644 --- a/tooner_lighting.cginc +++ b/tooner_lighting.cginc @@ -474,7 +474,7 @@ void geom(triangle v2f tri_in[3], tri_out.RestartStrip(); } -#if defined(_GLITTER) || defined(_RIM_LIGHTING0_GLITTER) || defined(_RIM_LIGHTING1_GLITTER) +#if defined(_GLITTER) || defined(_RIM_LIGHTING0_GLITTER) || defined(_RIM_LIGHTING1_GLITTER) || defined(_RIM_LIGHTING2_GLITTER) || defined(_RIM_LIGHTING3_GLITTER) float get_glitter(float2 uv, float3 worldPos, float3 normal, float density, float amount, float speed, float mask, float brightness, float angle, float power) @@ -1261,7 +1261,7 @@ float4 effect(inout v2f i) } #endif -#if defined(_MATCAP0) || defined(_MATCAP1) || defined(_RIM_LIGHTING0) || defined(_RIM_LIGHTING1) +#if defined(_MATCAP0) || defined(_MATCAP1) || defined(_RIM_LIGHTING0) || defined(_RIM_LIGHTING1) || defined(_RIM_LIGHTING2) || defined(_RIM_LIGHTING3) float3 matcap_emission = 0; float2 matcap_uv; float matcap_theta; @@ -1416,7 +1416,7 @@ float4 effect(inout v2f i) applyDecal(albedo, roughness, metallic, decal_emission, i); #endif -#if defined(_RIM_LIGHTING0) || defined(_RIM_LIGHTING1) +#if defined(_RIM_LIGHTING0) || defined(_RIM_LIGHTING1) || defined(_RIM_LIGHTING2) || defined(_RIM_LIGHTING3) { // identity: (a, b, c) and (c, c, -(a +b)) are perpendicular to each other float theta = atan2(length(cross(view_dir, normal)), dot(view_dir, normal)); @@ -1462,7 +1462,7 @@ float4 effect(inout v2f i) matcap_emission += lerp(0, matcap, matcap_mask) * _Rim_Lighting0_Emission; break; case 1: - matcap_emission = albedo.rgb * lerp(1, matcap, matcap_mask) * _Rim_Lighting0_Emission; + matcap_emission = albedo.rgb * lerp(0, matcap, matcap_mask) * _Rim_Lighting0_Emission; albedo.rgb *= lerp(1, matcap, matcap_mask); break; case 2: @@ -1529,7 +1529,7 @@ float4 effect(inout v2f i) matcap_emission += lerp(0, matcap, matcap_mask) * _Rim_Lighting1_Emission; break; case 1: - matcap_emission = albedo.rgb * lerp(1, matcap, matcap_mask) * _Rim_Lighting1_Emission; + matcap_emission = albedo.rgb * lerp(0, matcap, matcap_mask) * _Rim_Lighting1_Emission; albedo.rgb *= lerp(1, matcap, matcap_mask); break; case 2: @@ -1553,8 +1553,142 @@ float4 effect(inout v2f i) } } #endif // _RIM_LIGHTING1 +#if defined(_RIM_LIGHTING2) + { + float rl = abs(theta) / PI; // on [0, 1] + rl = pow(2, -_Rim_Lighting2_Power * abs(rl - _Rim_Lighting2_Center)); + float q = _Rim_Lighting2_Quantization; + if (q > 0) { + rl = floor(rl * q) / q; + } + float3 matcap = rl * _Rim_Lighting2_Color * _Rim_Lighting2_Strength; +#if defined(_RIM_LIGHTING2_MASK) + float4 matcap_mask_raw = _Rim_Lighting2_Mask.SampleGrad(linear_repeat_s, i.uv0.xy, iddx, iddy); + float matcap_mask = matcap_mask_raw.r; + matcap_mask = (bool) round(_Rim_Lighting2_Mask_Invert) ? 1 - matcap_mask : matcap_mask; + matcap_mask *= matcap_mask_raw.a; +#else + float matcap_mask = 1; +#endif +#if defined(_RIM_LIGHTING2_POLAR_MASK) + if (_Rim_Lighting2_PolarMask_Enabled) { + float pmask_theta = _Rim_Lighting2_PolarMask_Theta; + float pmask_pow = _Rim_Lighting2_PolarMask_Power; + float filter = abs(1.0 / (1.0 + pow(abs(matcap_theta - pmask_theta), pmask_pow)));; + if (q > 0) { + filter = floor(filter * q) / q; + } + matcap_mask *= filter; + } +#endif +#if defined(_RIM_LIGHTING2_GLITTER) + float rl_glitter = get_glitter(i.uv0, i.worldPos, normal, + _Rim_Lighting2_Glitter_Density, + _Rim_Lighting2_Glitter_Amount, _Rim_Lighting2_Glitter_Speed, + /*mask=*/1, /*brightness=*/1, /*angle=*/91, /*power=*/1); + rl_glitter = floor(rl_glitter * _Rim_Lighting2_Glitter_Quantization) / _Rim_Lighting2_Glitter_Quantization; + matcap_mask *= rl_glitter; +#endif + int mode = round(_Rim_Lighting2_Mode); + switch (mode) { + case 0: + albedo.rgb += lerp(0, matcap, matcap_mask); + matcap_emission += lerp(0, matcap, matcap_mask) * _Rim_Lighting2_Emission; + break; + case 1: + matcap_emission = albedo.rgb * lerp(0, matcap, matcap_mask) * _Rim_Lighting2_Emission; + albedo.rgb *= lerp(1, matcap, matcap_mask); + break; + case 2: + albedo.rgb = lerp(albedo.rgb, matcap, matcap_mask); + matcap_emission = lerp(albedo.rgb, matcap, matcap_mask) * _Rim_Lighting2_Emission; + break; + case 3: + albedo.rgb -= lerp(0, matcap, matcap_mask); + matcap_emission -= lerp(0, matcap, matcap_mask) * _Rim_Lighting2_Emission; + break; + case 4: + albedo.rgb = lerp(albedo.rgb, min(albedo.rgb, matcap), matcap_mask); + matcap_emission = lerp(albedo.rgb, min(albedo.rgb, matcap), matcap_mask) * _Rim_Lighting2_Emission; + break; + case 5: + albedo.rgb = lerp(albedo.rgb, max(albedo.rgb, matcap), matcap_mask); + matcap_emission = lerp(albedo.rgb, max(albedo.rgb, matcap), matcap_mask) * _Rim_Lighting2_Emission; + break; + default: + break; + } + } +#endif // _RIM_LIGHTING2 +#if defined(_RIM_LIGHTING3) + { + float rl = abs(theta) / PI; // on [0, 1] + rl = pow(2, -_Rim_Lighting3_Power * abs(rl - _Rim_Lighting3_Center)); + float q = _Rim_Lighting3_Quantization; + if (q > 0) { + rl = floor(rl * q) / q; + } + float3 matcap = rl * _Rim_Lighting3_Color * _Rim_Lighting3_Strength; +#if defined(_RIM_LIGHTING3_MASK) + float4 matcap_mask_raw = _Rim_Lighting3_Mask.SampleGrad(linear_repeat_s, i.uv0.xy, iddx, iddy); + float matcap_mask = matcap_mask_raw.r; + matcap_mask = (bool) round(_Rim_Lighting3_Mask_Invert) ? 1 - matcap_mask : matcap_mask; + matcap_mask *= matcap_mask_raw.a; +#else + float matcap_mask = 1; +#endif +#if defined(_RIM_LIGHTING3_POLAR_MASK) + if (_Rim_Lighting3_PolarMask_Enabled) { + float pmask_theta = _Rim_Lighting3_PolarMask_Theta; + float pmask_pow = _Rim_Lighting3_PolarMask_Power; + float filter = abs(1.0 / (1.0 + pow(abs(matcap_theta - pmask_theta), pmask_pow)));; + if (q > 0) { + filter = floor(filter * q) / q; + } + matcap_mask *= filter; + } +#endif +#if defined(_RIM_LIGHTING3_GLITTER) + float rl_glitter = get_glitter(i.uv0, i.worldPos, normal, + _Rim_Lighting3_Glitter_Density, + _Rim_Lighting3_Glitter_Amount, _Rim_Lighting3_Glitter_Speed, + /*mask=*/1, /*brightness=*/1, /*angle=*/91, /*power=*/1); + rl_glitter = floor(rl_glitter * _Rim_Lighting3_Glitter_Quantization) / _Rim_Lighting3_Glitter_Quantization; + matcap_mask *= rl_glitter; +#endif + int mode = round(_Rim_Lighting3_Mode); + switch (mode) { + case 0: + albedo.rgb += lerp(0, matcap, matcap_mask); + matcap_emission += lerp(0, matcap, matcap_mask) * _Rim_Lighting3_Emission; + break; + case 1: + matcap_emission = albedo.rgb * lerp(0, matcap, matcap_mask) * _Rim_Lighting3_Emission; + albedo.rgb *= lerp(1, matcap, matcap_mask); + break; + case 2: + albedo.rgb = lerp(albedo.rgb, matcap, matcap_mask); + matcap_emission = lerp(albedo.rgb, matcap, matcap_mask) * _Rim_Lighting3_Emission; + break; + case 3: + albedo.rgb -= lerp(0, matcap, matcap_mask); + matcap_emission -= lerp(0, matcap, matcap_mask) * _Rim_Lighting3_Emission; + break; + case 4: + albedo.rgb = lerp(albedo.rgb, min(albedo.rgb, matcap), matcap_mask); + matcap_emission = lerp(albedo.rgb, min(albedo.rgb, matcap), matcap_mask) * _Rim_Lighting3_Emission; + break; + case 5: + albedo.rgb = lerp(albedo.rgb, max(albedo.rgb, matcap), matcap_mask); + matcap_emission = lerp(albedo.rgb, max(albedo.rgb, matcap), matcap_mask) * _Rim_Lighting3_Emission; + break; + default: + break; + } + } +#endif // _RIM_LIGHTING3 } -#endif // _RIM_LIGHTING0 || _RIM_LIGHTING1 +#endif // _RIM_LIGHTING0 || _RIM_LIGHTING1 || _RIM_LIGHTING2 || _RIM_LIGHTING3 #if defined(_OKLAB) // Do hue shift in perceptually uniform color space so it doesn't look like |
