summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2024-10-25 15:05:56 -0700
committeryum <yum.food.vr@gmail.com>2024-10-25 15:05:56 -0700
commit94f37fa8dd94137a910df4ebc80f98db2d685f08 (patch)
tree4a4b77203f1f4fa911ea4fa9a351a1d6ed911f2d
parent1705cd25f5bcd796a560bcce22ef91d190a94900 (diff)
Add features for constant rim lighting view direction
Add vector to control rim lighting view dir (y does nothing) and toggle to enable doing reflection calculation in world space.
-rw-r--r--Editor/tooner.cs23
-rw-r--r--feature_macros.cginc8
-rw-r--r--globals.cginc12
-rw-r--r--tooner.shader12
-rw-r--r--tooner_lighting.cginc40
5 files changed, 91 insertions, 4 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs
index bd98d37..deb2357 100644
--- a/Editor/tooner.cs
+++ b/Editor/tooner.cs
@@ -936,6 +936,29 @@ public class ToonerGUI : ShaderGUI {
EditorGUI.indentLevel -= 1;
}
+ bc = FindProperty($"_Rim_Lighting{i}_Custom_View_Vector_Enabled");
+ enabled = bc.floatValue > 1E-6;
+ EditorGUI.BeginChangeCheck();
+ enabled = Toggle("Custom view vector", enabled);
+ EditorGUI.EndChangeCheck();
+ bc.floatValue = enabled ? 1.0f : 0.0f;
+ SetKeyword($"_RIM_LIGHTING{i}_CUSTOM_VIEW_VECTOR", enabled);
+
+ if (enabled) {
+ EditorGUI.indentLevel += 1;
+ bc = FindProperty($"_Rim_Lighting{i}_Custom_View_Vector");
+ VectorProperty(bc, "Vector");
+ EditorGUI.indentLevel -= 1;
+ }
+
+ bc = FindProperty($"_Rim_Lighting{i}_Reflect_In_World_Space");
+ enabled = bc.floatValue > 1E-6;
+ EditorGUI.BeginChangeCheck();
+ enabled = Toggle("Reflect in world space", enabled);
+ EditorGUI.EndChangeCheck();
+ bc.floatValue = enabled ? 1.0f : 0.0f;
+ SetKeyword($"_RIM_LIGHTING{i}_REFLECT_IN_WORLD", enabled);
+
EditorGUI.indentLevel -= 1;
show_ui.RemoveAt(show_ui.Count - 1);
}
diff --git a/feature_macros.cginc b/feature_macros.cginc
index 1cb3233..c7ac050 100644
--- a/feature_macros.cginc
+++ b/feature_macros.cginc
@@ -37,24 +37,32 @@
#pragma shader_feature_local _ _RIM_LIGHTING0_POLAR_MASK
#pragma shader_feature_local _ _RIM_LIGHTING0_SAMPLER_REPEAT
#pragma shader_feature_local _ _RIM_LIGHTING0_SAMPLER_CLAMP
+#pragma shader_feature_local _ _RIM_LIGHTING0_CUSTOM_VIEW_VECTOR
+#pragma shader_feature_local _ _RIM_LIGHTING0_REFLECT_IN_WORLD
#pragma shader_feature_local _ _RIM_LIGHTING1
#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_LIGHTING1_SAMPLER_REPEAT
#pragma shader_feature_local _ _RIM_LIGHTING1_SAMPLER_CLAMP
+#pragma shader_feature_local _ _RIM_LIGHTING1_CUSTOM_VIEW_VECTOR
+#pragma shader_feature_local _ _RIM_LIGHTING1_REFLECT_IN_WORLD
#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_LIGHTING2_SAMPLER_REPEAT
#pragma shader_feature_local _ _RIM_LIGHTING2_SAMPLER_CLAMP
+#pragma shader_feature_local _ _RIM_LIGHTING2_CUSTOM_VIEW_VECTOR
+#pragma shader_feature_local _ _RIM_LIGHTING2_REFLECT_IN_WORLD
#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 _ _RIM_LIGHTING3_SAMPLER_REPEAT
#pragma shader_feature_local _ _RIM_LIGHTING3_SAMPLER_CLAMP
+#pragma shader_feature_local _ _RIM_LIGHTING3_CUSTOM_VIEW_VECTOR
+#pragma shader_feature_local _ _RIM_LIGHTING3_REFLECT_IN_WORLD
#pragma shader_feature_local _ _OKLAB
#pragma shader_feature_local _ _HSV0
#pragma shader_feature_local _ _HSV1
diff --git a/globals.cginc b/globals.cginc
index 3a9616b..f1a7fc3 100644
--- a/globals.cginc
+++ b/globals.cginc
@@ -430,6 +430,9 @@ float _Rim_Lighting0_PolarMask_Enabled;
float _Rim_Lighting0_PolarMask_Theta;
float _Rim_Lighting0_PolarMask_Power;
#endif
+#if defined(_RIM_LIGHTING0_CUSTOM_VIEW_VECTOR)
+float4 _Rim_Lighting0_Custom_View_Vector;
+#endif
#endif
#if defined(_RIM_LIGHTING1)
@@ -459,6 +462,9 @@ float _Rim_Lighting1_PolarMask_Enabled;
float _Rim_Lighting1_PolarMask_Theta;
float _Rim_Lighting1_PolarMask_Power;
#endif
+#if defined(_RIM_LIGHTING1_CUSTOM_VIEW_VECTOR)
+float4 _Rim_Lighting1_Custom_View_Vector;
+#endif
#endif
#if defined(_RIM_LIGHTING2)
@@ -488,6 +494,9 @@ float _Rim_Lighting2_PolarMask_Enabled;
float _Rim_Lighting2_PolarMask_Theta;
float _Rim_Lighting2_PolarMask_Power;
#endif
+#if defined(_RIM_LIGHTING2_CUSTOM_VIEW_VECTOR)
+float4 _Rim_Lighting2_Custom_View_Vector;
+#endif
#endif
#if defined(_RIM_LIGHTING3)
@@ -517,6 +526,9 @@ float _Rim_Lighting3_PolarMask_Enabled;
float _Rim_Lighting3_PolarMask_Theta;
float _Rim_Lighting3_PolarMask_Power;
#endif
+#if defined(_RIM_LIGHTING3_CUSTOM_VIEW_VECTOR)
+float4 _Rim_Lighting3_Custom_View_Vector;
+#endif
#endif
#if defined(_OKLAB)
diff --git a/tooner.shader b/tooner.shader
index 55ec40c..db54d6e 100644
--- a/tooner.shader
+++ b/tooner.shader
@@ -344,7 +344,10 @@ Shader "yum_food/tooner"
_Rim_Lighting0_PolarMask_Enabled("Rim lighting polar mask enabled", Float) = 0
_Rim_Lighting0_PolarMask_Theta("Rim lighting polar mask - theta", Float) = 0
_Rim_Lighting0_PolarMask_Power("Rim lighting polar mask - power", Float) = 3
+ _Rim_Lighting0_Custom_View_Vector_Enabled("custom view vector", Float) = 0
+ _Rim_Lighting0_Custom_View_Vector("custom view vector", Vector) = (1, 0, 0, 0)
_Rim_Lighting0_Center_Eye_Fix("Enable center eye fix", Float) = 0
+ _Rim_Lighting0_Reflect_In_World_Space("Reflect in world space", Float) = 0
_Rim_Lighting1_Enabled("Enable rim lighting", Float) = 0
_Rim_Lighting1_Mode("Rim lighting mode", Float) = 0
@@ -367,7 +370,10 @@ Shader "yum_food/tooner"
_Rim_Lighting1_PolarMask_Enabled("Rim lighting polar mask enabled", Float) = 0
_Rim_Lighting1_PolarMask_Theta("Rim lighting polar mask - theta", Float) = 0
_Rim_Lighting1_PolarMask_Power("Rim lighting polar mask - power", Float) = 3
+ _Rim_Lighting1_Custom_View_Vector_Enabled("custom view vector", Float) = 0
+ _Rim_Lighting1_Custom_View_Vector("custom view vector", Vector) = (1, 0, 0, 0)
_Rim_Lighting1_Center_Eye_Fix("Enable center eye fix", Float) = 0
+ _Rim_Lighting1_Reflect_In_World_Space("Reflect in world space", Float) = 0
_Rim_Lighting2_Enabled("Enable rim lighting", Float) = 0
_Rim_Lighting2_Mode("Rim lighting mode", Float) = 0
@@ -390,7 +396,10 @@ Shader "yum_food/tooner"
_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_Lighting2_Custom_View_Vector_Enabled("custom view vector", Float) = 0
+ _Rim_Lighting2_Custom_View_Vector("custom view vector", Vector) = (1, 0, 0, 0)
_Rim_Lighting2_Center_Eye_Fix("Enable center eye fix", Float) = 0
+ _Rim_Lighting2_Reflect_In_World_Space("Reflect in world space", Float) = 0
_Rim_Lighting3_Enabled("Enable rim lighting", Float) = 0
_Rim_Lighting3_Mode("Rim lighting mode", Float) = 0
@@ -413,7 +422,10 @@ Shader "yum_food/tooner"
_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
+ _Rim_Lighting3_Custom_View_Vector_Enabled("custom view vector", Float) = 0
+ _Rim_Lighting3_Custom_View_Vector("custom view vector", Vector) = (1, 0, 0, 0)
_Rim_Lighting3_Center_Eye_Fix("Enable center eye fix", Float) = 0
+ _Rim_Lighting3_Reflect_In_World_Space("Reflect in world space", Float) = 0
_OKLAB_Enabled("Enable OKLAB", Float) = 0.0
_OKLAB_Mask("Mask", 2D) = "white" {}
diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc
index bcad86a..1b306ce 100644
--- a/tooner_lighting.cginc
+++ b/tooner_lighting.cginc
@@ -1708,10 +1708,18 @@ float4 effect(inout v2f i, out float depth)
#if defined(_RIM_LIGHTING0)
{
float3 rl_view_dir = VIEW_DIR(_Rim_Lighting0_Center_Eye_Fix);
+#if defined(_RIM_LIGHTING0_CUSTOM_VIEW_VECTOR)
+ rl_view_dir.xz = normalize(_Rim_Lighting0_Custom_View_Vector).xz;
+#endif
float2 rl_uv;
{
+#if defined(_RIM_LIGHTING0_REFLECT_IN_WORLD)
+ const float3 cam_normal = normal;
+ const float3 cam_view_dir = rl_view_dir;
+#else
const float3 cam_normal = normalize(mul(UNITY_MATRIX_V, float4(normal, 0)));
const float3 cam_view_dir = normalize(mul(UNITY_MATRIX_V, float4(rl_view_dir, 0)));
+#endif
const float3 cam_refl = -reflect(cam_view_dir, cam_normal);
float m = 2.0 * sqrt(
cam_refl.x * cam_refl.x +
@@ -1723,7 +1731,7 @@ float4 effect(inout v2f i, out float depth)
float rl = length(rl_uv - 0.5);
rl = pow(2, -_Rim_Lighting0_Power * abs(rl - _Rim_Lighting0_Center));
float q = _Rim_Lighting0_Quantization;
- if (q > -1) {
+ if (q > 0) {
rl = floor(rl * q) / q;
}
float3 matcap = rl * _Rim_Lighting0_Color * _Rim_Lighting0_Strength;
@@ -1798,11 +1806,19 @@ float4 effect(inout v2f i, out float depth)
#endif // _RIM_LIGHTING0
#if defined(_RIM_LIGHTING1)
{
- float3 rl_view_dir = VIEW_DIR(_Rim_Lighting0_Center_Eye_Fix);
+ float3 rl_view_dir = VIEW_DIR(_Rim_Lighting1_Center_Eye_Fix);
+#if defined(_RIM_LIGHTING1_CUSTOM_VIEW_VECTOR)
+ rl_view_dir.xz = normalize(_Rim_Lighting1_Custom_View_Vector).xz;
+#endif
float2 rl_uv;
{
+#if defined(_RIM_LIGHTING1_REFLECT_IN_WORLD)
+ const float3 cam_normal = normal;
+ const float3 cam_view_dir = rl_view_dir;
+#else
const float3 cam_normal = normalize(mul(UNITY_MATRIX_V, float4(normal, 0)));
const float3 cam_view_dir = normalize(mul(UNITY_MATRIX_V, float4(rl_view_dir, 0)));
+#endif
const float3 cam_refl = -reflect(cam_view_dir, cam_normal);
float m = 2.0 * sqrt(
cam_refl.x * cam_refl.x +
@@ -1889,11 +1905,19 @@ float4 effect(inout v2f i, out float depth)
#endif // _RIM_LIGHTING1
#if defined(_RIM_LIGHTING2)
{
- float3 rl_view_dir = VIEW_DIR(_Rim_Lighting0_Center_Eye_Fix);
+ float3 rl_view_dir = VIEW_DIR(_Rim_Lighting2_Center_Eye_Fix);
+#if defined(_RIM_LIGHTING2_CUSTOM_VIEW_VECTOR)
+ rl_view_dir.xz = normalize(_Rim_Lighting2_Custom_View_Vector).xz;
+#endif
float2 rl_uv;
{
+#if defined(_RIM_LIGHTING2_REFLECT_IN_WORLD)
+ const float3 cam_normal = normal;
+ const float3 cam_view_dir = rl_view_dir;
+#else
const float3 cam_normal = normalize(mul(UNITY_MATRIX_V, float4(normal, 0)));
const float3 cam_view_dir = normalize(mul(UNITY_MATRIX_V, float4(rl_view_dir, 0)));
+#endif
const float3 cam_refl = -reflect(cam_view_dir, cam_normal);
float m = 2.0 * sqrt(
cam_refl.x * cam_refl.x +
@@ -1980,11 +2004,19 @@ float4 effect(inout v2f i, out float depth)
#endif // _RIM_LIGHTING2
#if defined(_RIM_LIGHTING3)
{
- float3 rl_view_dir = VIEW_DIR(_Rim_Lighting0_Center_Eye_Fix);
+ float3 rl_view_dir = VIEW_DIR(_Rim_Lighting3_Center_Eye_Fix);
+#if defined(_RIM_LIGHTING3_CUSTOM_VIEW_VECTOR)
+ rl_view_dir.xz = normalize(_Rim_Lighting3_Custom_View_Vector).xz;
+#endif
float2 rl_uv;
{
+#if defined(_RIM_LIGHTING3_REFLECT_IN_WORLD)
+ const float3 cam_normal = normal;
+ const float3 cam_view_dir = rl_view_dir;
+#else
const float3 cam_normal = normalize(mul(UNITY_MATRIX_V, float4(normal, 0)));
const float3 cam_view_dir = normalize(mul(UNITY_MATRIX_V, float4(rl_view_dir, 0)));
+#endif
const float3 cam_refl = -reflect(cam_view_dir, cam_normal);
float m = 2.0 * sqrt(
cam_refl.x * cam_refl.x +