From 65ed0c23335b10a266d76257eeb3e7ecfd23cfb5 Mon Sep 17 00:00:00 2001 From: yum Date: Thu, 20 Feb 2025 00:07:46 -0800 Subject: Add directionality and quantization to rim lighting --- 2ner.shader | 12 ++++++++++++ features.cginc | 4 ++++ globals.cginc | 15 +++++++++++++++ matcaps.cginc | 21 +++++++++++++++++++++ math.cginc | 6 ++++++ 5 files changed, 58 insertions(+) diff --git a/2ner.shader b/2ner.shader index 6f4d0fd..f4c4db9 100644 --- a/2ner.shader +++ b/2ner.shader @@ -91,6 +91,18 @@ Shader "yum_food/2ner" [ThryToggle(_RIM_LIGHTING0_MASK)]_Rim_Lighting0_Mask_Enabled("Enable", Float) = 0 _Rim_Lighting0_Mask("Mask", 2D) = "white" {} [HideInInspector] m_end_Rim_Lighting0_Mask("Mask", Float) = 0 + + [HideInInspector] m_start_Rim_Lighting0_Angle_Limit("Angle limit", Float) = 0 + [ThryToggle(_RIM_LIGHTING0_ANGLE_LIMIT)]_Rim_Lighting0_Angle_Limit_Enabled("Enable", Float) = 0 + _Rim_Lighting0_Angle_Limit_Target_Vector("Target vector", Vector) = (0, -1, 0, 0) + _Rim_Lighting0_Angle_Limit_Power("Power", Float) = 1 + [HideInInspector] m_end_Rim_Lighting0_Angle_Limit("Angle limit", Float) = 0 + + [HideInInspector] m_start_Rim_Lighting0_Quantization("Quantization", Float) = 0 + [ThryToggle(_RIM_LIGHTING0_QUANTIZATION)]_Rim_Lighting0_Quantization_Enabled("Enable", Float) = 0 + _Rim_Lighting0_Quantization_Steps("Steps", Float) = 1 + [HideInInspector] m_end_Rim_Lighting0_Quantization("Quantization", Float) = 0 + [HideInInspector] m_end_Rim_Lighting0("Rim lighting", Float) = 0 [HideInInspector] m_start_Rim_Lighting1("Rim lighting 1", Float) = 0 [ThryToggle(_RIM_LIGHTING1)]_Rim_Lighting1_Enabled("Enable", Float) = 0 diff --git a/features.cginc b/features.cginc index 9976d45..718b63f 100644 --- a/features.cginc +++ b/features.cginc @@ -28,10 +28,14 @@ //ifex _Rim_Lighting0_Enabled==0 #pragma shader_feature_local _RIM_LIGHTING0 #pragma shader_feature_local _RIM_LIGHTING0_MASK +#pragma shader_feature_local _RIM_LIGHTING0_ANGLE_LIMIT +#pragma shader_feature_local _RIM_LIGHTING0_QUANTIZATION //endex //ifex _Rim_Lighting1_Enabled==0 #pragma shader_feature_local _RIM_LIGHTING1 #pragma shader_feature_local _RIM_LIGHTING1_MASK +#pragma shader_feature_local _RIM_LIGHTING1_ANGLE_LIMIT +#pragma shader_feature_local _RIM_LIGHTING1_QUANTIZATION //endex //ifex _Vertex_Domain_Warping_Enabled==0 diff --git a/globals.cginc b/globals.cginc index 4d357db..14ec4aa 100644 --- a/globals.cginc +++ b/globals.cginc @@ -74,7 +74,15 @@ float _Rim_Lighting0_Brightness; #if defined(_RIM_LIGHTING0_MASK) texture2D _Rim_Lighting0_Mask; #endif +#if defined(_RIM_LIGHTING0_ANGLE_LIMIT) +float2 _Rim_Lighting0_Angle_Limit_Target_Vector; +float _Rim_Lighting0_Angle_Limit_Power; #endif +#if defined(_RIM_LIGHTING0_QUANTIZATION) +float _Rim_Lighting0_Quantization_Steps; +#endif +#endif + #if defined(_RIM_LIGHTING1) uint _Rim_Lighting1_Mode; float _Rim_Lighting1_Center; @@ -84,6 +92,13 @@ float _Rim_Lighting1_Brightness; #if defined(_RIM_LIGHTING1_MASK) texture2D _Rim_Lighting1_Mask; #endif +#if defined(_RIM_LIGHTING1_ANGLE_LIMIT) +float2 _Rim_Lighting1_Angle_Limit_Target_Vector; +float _Rim_Lighting1_Angle_Limit_Power; +#endif +#if defined(_RIM_LIGHTING1_QUANTIZATION) +float _Rim_Lighting1_Quantization_Steps; +#endif #endif #if defined(_VERTEX_DOMAIN_WARPING) diff --git a/matcaps.cginc b/matcaps.cginc index 555dcc7..78f2cce 100644 --- a/matcaps.cginc +++ b/matcaps.cginc @@ -43,6 +43,13 @@ void applyMatcap(inout YumPbr pbr, float3 sample, uint mode, float mask) } #endif +float getAngleAttenuation(float2 muv, float2 target_vector, float power) { + muv = muv * 2 - 1; + float NoL = dot(muv, target_vector); + NoL = halfLambertianNoL(NoL); + return pow(NoL, power); +} + void applyMatcapsAndRimLighting(v2f i, inout YumPbr pbr) { #if defined(_MATCAP0) || defined(_RIM_LIGHTING0) || defined(_RIM_LIGHTING1) float2 muv = getMatcapUV(i, pbr); @@ -68,6 +75,13 @@ void applyMatcapsAndRimLighting(v2f i, inout YumPbr pbr) { float rl0_mask = _Rim_Lighting0_Mask.Sample(linear_repeat_s, i.uv01.xy); #else float rl0_mask = 1; +#endif +#if defined(_RIM_LIGHTING0_ANGLE_LIMIT) + rl0 *= getAngleAttenuation(muv, _Rim_Lighting0_Angle_Limit_Target_Vector, + _Rim_Lighting0_Angle_Limit_Power); +#endif +#if defined(_RIM_LIGHTING0_QUANTIZATION) + rl0 = floor(rl0 * _Rim_Lighting0_Quantization_Steps) / _Rim_Lighting0_Quantization_Steps; #endif applyMatcap(pbr, rl0, _Rim_Lighting0_Mode, rl0_mask); #endif @@ -78,6 +92,13 @@ void applyMatcapsAndRimLighting(v2f i, inout YumPbr pbr) { float rl1_mask = _Rim_Lighting1_Mask.Sample(linear_repeat_s, i.uv01.xy); #else float rl1_mask = 1; +#endif +#if defined(_RIM_LIGHTING1_ANGLE_LIMIT) + rl1 *= getAngleAttenuation(muv, _Rim_Lighting1_Angle_Limit_Target_Vector, + _Rim_Lighting1_Angle_Limit_Power); +#endif +#if defined(_RIM_LIGHTING1_QUANTIZATION) + rl1 = floor(rl1 * _Rim_Lighting1_Quantization_Steps) / _Rim_Lighting1_Quantization_Steps; #endif applyMatcap(pbr, rl1, _Rim_Lighting1_Mode, rl1_mask); #endif diff --git a/math.cginc b/math.cginc index 414f618..8edbc88 100644 --- a/math.cginc +++ b/math.cginc @@ -17,6 +17,12 @@ float wrapNoL(float NoL, float factor) { return pow(max(1E-4, (NoL + factor) / (1 + factor)), 1 + factor); } +float halfLambertianNoL(float NoL) { + // https://www.iro.umontreal.ca/~derek/files/jgt_wrap_final.pdf + float tmp = (NoL + 1) * 0.5; + return tmp * tmp; +} + float rand1(float p) { return frac(sin(p) * 43758.5453123); -- cgit v1.2.3