diff options
| author | yum <yum.food.vr@gmail.com> | 2024-08-17 14:33:03 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2024-08-17 14:33:03 -0700 |
| commit | d4b2d29792b44eab941019713fa7b3df5f460443 (patch) | |
| tree | ec093b26c8a847699c1ecda111c8744824d77261 | |
| parent | 5528b313bb1b6b85aa7b779e7170e0ec1bbd2590 (diff) | |
Add proximity dimming feature
Also overhaul brightness clamping code. It now occurs in HSV space.
| -rw-r--r-- | Editor/tooner.cs | 25 | ||||
| -rw-r--r-- | feature_macros.cginc | 1 | ||||
| -rw-r--r-- | globals.cginc | 6 | ||||
| -rw-r--r-- | pbr.cginc | 53 | ||||
| -rw-r--r-- | tooner.shader | 5 |
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; @@ -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 |
