summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2024-08-17 14:33:03 -0700
committeryum <yum.food.vr@gmail.com>2024-08-17 14:33:03 -0700
commitd4b2d29792b44eab941019713fa7b3df5f460443 (patch)
treeec093b26c8a847699c1ecda111c8744824d77261
parent5528b313bb1b6b85aa7b779e7170e0ec1bbd2590 (diff)
Add proximity dimming feature
Also overhaul brightness clamping code. It now occurs in HSV space.
-rw-r--r--Editor/tooner.cs25
-rw-r--r--feature_macros.cginc1
-rw-r--r--globals.cginc6
-rw-r--r--pbr.cginc53
-rw-r--r--tooner.shader5
5 files changed, 76 insertions, 14 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs
index e0a8bfc..53bdc46 100644
--- a/Editor/tooner.cs
+++ b/Editor/tooner.cs
@@ -1495,9 +1495,32 @@ public class ToonerGUI : ShaderGUI {
"Mipmap multiplier");
bc.floatValue = (float) Math.Max(1E-6, bc.floatValue);
+ bc = FindProperty("_Proximity_Dimming_Enable_Static");
+ bool enabled = bc.floatValue > 1E-6;
+ EditorGUI.BeginChangeCheck();
+ enabled = EditorGUILayout.Toggle("Proximity dimming", enabled);
+ EditorGUI.EndChangeCheck();
+ bc.floatValue = enabled ? 1.0f : 0.0f;
+ SetKeyword("_PROXIMITY_DIMMING", enabled);
+
+ if (enabled) {
+ EditorGUI.indentLevel += 1;
+
+ bc = FindProperty("_Proximity_Dimming_Min_Dist");
+ editor.FloatProperty(bc, "Min distance");
+
+ bc = FindProperty("_Proximity_Dimming_Max_Dist");
+ editor.FloatProperty(bc, "Max distance");
+
+ bc = FindProperty("_Proximity_Dimming_Factor");
+ editor.FloatProperty(bc, "Dimming factor");
+
+ EditorGUI.indentLevel -= 1;
+ }
+
#if LTCGI_INCLUDED
bc = FindProperty("_LTCGI_Enabled");
- bool enabled = bc.floatValue > 1E-6;
+ enabled = bc.floatValue > 1E-6;
EditorGUI.BeginChangeCheck();
enabled = EditorGUILayout.Toggle("Enable LTCGI", enabled);
EditorGUI.EndChangeCheck();
diff --git a/feature_macros.cginc b/feature_macros.cginc
index 8f15a6d..432a29d 100644
--- a/feature_macros.cginc
+++ b/feature_macros.cginc
@@ -138,6 +138,7 @@
#pragma shader_feature_local _ _CLEARCOAT
#pragma shader_feature_local _ _CLEARCOAT_MASK
#pragma shader_feature_local _ _CLEARCOAT_MASK2
+#pragma shader_feature_local _ _PROXIMITY_DIMMING
#endif // __FEATURE_MACROS_INC
diff --git a/globals.cginc b/globals.cginc
index 9a5a130..e294bd6 100644
--- a/globals.cginc
+++ b/globals.cginc
@@ -45,6 +45,12 @@ float3 shadowedReflections;
float3 _ReflShadows;
float3 _ReflShadowStrength;
+#if defined(_PROXIMITY_DIMMING)
+float _Proximity_Dimming_Min_Dist;
+float _Proximity_Dimming_Max_Dist;
+float _Proximity_Dimming_Factor;
+#endif
+
#if defined(_CLEARCOAT)
float _Clearcoat_Enabled;
float _Clearcoat_Strength;
diff --git a/pbr.cginc b/pbr.cginc
index 9fc9fa4..ef8b1d4 100644
--- a/pbr.cginc
+++ b/pbr.cginc
@@ -236,26 +236,53 @@ float4 getLitColor(
}
#endif
+ direct_light.color = RGBtoHSV(direct_light.color);
+ indirect_light.specular = RGBtoHSV(indirect_light.specular);
+ indirect_light.diffuse = RGBtoHSV(indirect_light.diffuse);
+
if (_Reflection_Probe_Saturation < 1.0) {
- direct_light.color = RGBtoHSV(direct_light.color);
direct_light.color[1] *= _Reflection_Probe_Saturation;
- direct_light.color = HSVtoRGB(direct_light.color);
- indirect_light.specular = RGBtoHSV(indirect_light.specular);
indirect_light.specular[1] *= _Reflection_Probe_Saturation;
- indirect_light.specular = HSVtoRGB(indirect_light.specular);
- indirect_light.diffuse = RGBtoHSV(indirect_light.diffuse);
indirect_light.diffuse[1] *= _Reflection_Probe_Saturation;
- indirect_light.diffuse = HSVtoRGB(indirect_light.diffuse);
}
- direct_light.color = clamp(direct_light.color, _Min_Brightness, _Max_Brightness);
- indirect_light.diffuse = clamp(indirect_light.diffuse, _Min_Brightness, _Max_Brightness);
- indirect_light.specular = clamp(indirect_light.specular, _Min_Brightness, _Max_Brightness);
+#if defined(_PROXIMITY_DIMMING)
+ {
+ float cam_dist = length(_WorldSpaceCameraPos - worldPos);
+ cam_dist = clamp(cam_dist, _Proximity_Dimming_Min_Dist,
+ _Proximity_Dimming_Max_Dist);
+ // Map onto [0, 1]
+ cam_dist = (cam_dist - _Proximity_Dimming_Min_Dist) /
+ (_Proximity_Dimming_Max_Dist - _Proximity_Dimming_Min_Dist);
+ float dim_factor = lerp(_Proximity_Dimming_Factor, 1, cam_dist);
+ direct_light.color[2] *= dim_factor;
+ indirect_light.diffuse[2] *= dim_factor;
+ indirect_light.specular[2] *= dim_factor;
+ }
+#endif
- // TODO move back before clamping
- direct_light.color *= _Lighting_Factor * _Direct_Lighting_Factor * enable_direct;
- indirect_light.specular *= _Lighting_Factor * _Indirect_Specular_Lighting_Factor;
- indirect_light.diffuse *= _Lighting_Factor * _Indirect_Diffuse_Lighting_Factor;
+ direct_light.color[2] *= _Lighting_Factor * _Direct_Lighting_Factor * enable_direct;
+ indirect_light.specular[2] *= _Lighting_Factor * _Indirect_Specular_Lighting_Factor;
+ indirect_light.diffuse[2] *= _Lighting_Factor * _Indirect_Diffuse_Lighting_Factor;
+
+ float2 brightnesses = float2(
+ direct_light.color[2],
+ indirect_light.diffuse[2]);
+ // Do this to avoid division by 0. If both light sources are black,
+ // sum_brightness could be 0;
+ brightnesses = max(brightnesses, min(_Min_Brightness, .001));
+ float sum_brightness = brightnesses[0] + brightnesses[1];
+ float2 brightness_proportions = brightnesses / sum_brightness;
+ sum_brightness = clamp(sum_brightness, _Min_Brightness, _Max_Brightness);
+ direct_light.color[2] = sum_brightness * brightness_proportions[0];
+ indirect_light.diffuse[2] = sum_brightness * brightness_proportions[1];
+
+ // Specular has to be clamped separately to avoid artifacting.
+ indirect_light.specular[2] = clamp(indirect_light.specular[2], _Min_Brightness, _Max_Brightness);
+
+ direct_light.color = HSVtoRGB(direct_light.color);
+ indirect_light.specular = HSVtoRGB(indirect_light.specular);
+ indirect_light.diffuse = HSVtoRGB(indirect_light.diffuse);
// Apply AO
indirect_light.diffuse *= ao;
diff --git a/tooner.shader b/tooner.shader
index 7ae6a85..9ab319b 100644
--- a/tooner.shader
+++ b/tooner.shader
@@ -164,6 +164,11 @@ Shader "yum_food/tooner"
_Ambient_Occlusion("Ambient occlusion", 2D) = "white" {}
_Ambient_Occlusion_Strength("Ambient occlusion", Range(0,1)) = 1
+ _Proximity_Dimming_Enable_Static("Enable proximity dimming", Float) = 0
+ _Proximity_Dimming_Min_Dist("Proximity dimming min distance", Float) = 0
+ _Proximity_Dimming_Max_Dist("Proximity dimming max distance", Float) = 1
+ _Proximity_Dimming_Factor("Proximity dimming max distance", Float) = 0
+
_Shading_Mode("Shading mode", Range(0, 1)) = 0
_Mesh_Normals_Mode("Normals mode", Float) = 0.0
_Flatten_Mesh_Normals_Str("Flatten mesh normals strength", Float) = 100.0