summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--2ner.shader12
-rw-r--r--features.cginc4
-rw-r--r--globals.cginc15
-rw-r--r--matcaps.cginc21
-rw-r--r--math.cginc6
5 files changed, 58 insertions, 0 deletions
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);
@@ -69,6 +76,13 @@ void applyMatcapsAndRimLighting(v2f i, inout YumPbr pbr) {
#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
#if defined(_RIM_LIGHTING1)
@@ -79,6 +93,13 @@ void applyMatcapsAndRimLighting(v2f i, inout YumPbr pbr) {
#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);