summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2024-08-10 17:08:39 -0700
committeryum <yum.food.vr@gmail.com>2024-08-10 17:08:39 -0700
commitbcba7f9bdb8a12314eff05f666b2c6e01d4d5818 (patch)
treedaa6d9b87e9480db1923ab707661c46a0747e4bd
parent7ce783162a9be36c5e75c90d347bcf65182598c4 (diff)
Add two more rim lighting slots
-rw-r--r--Editor/tooner.cs2
-rw-r--r--feature_macros.cginc8
-rw-r--r--globals.cginc50
-rw-r--r--tooner.shader38
-rw-r--r--tooner_lighting.cginc146
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