diff options
| author | yum <yum.food.vr@gmail.com> | 2024-08-22 01:45:12 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2024-08-22 01:45:12 -0700 |
| commit | 6647234da5e504b48cd2a72c52e24e9696ff9ee9 (patch) | |
| tree | fabeb130753aad74150d1b3a43398058372e1baf | |
| parent | 5c3223949546fee336ba50e5e33736b83c450d78 (diff) | |
Matcap can now overwrite rim lighting in a configurable way
| -rw-r--r-- | Editor/tooner.cs | 9 | ||||
| -rw-r--r-- | globals.cginc | 8 | ||||
| -rw-r--r-- | tooner.shader | 10 | ||||
| -rw-r--r-- | tooner_lighting.cginc | 51 |
4 files changed, 72 insertions, 6 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs index 8cb4d07..ccd07c1 100644 --- a/Editor/tooner.cs +++ b/Editor/tooner.cs @@ -545,6 +545,15 @@ public class ToonerGUI : ShaderGUI { bc.floatValue = enabled ? 1.0f : 0.0f; SetKeyword($"_MATCAP{i}_DISTORTION0", enabled); + for (int j = 0; j < 4; j++) { + bc = FindProperty($"_Matcap{i}_Overwrite_Rim_Lighting_{j}"); + enabled = bc.floatValue > 1E-6; + EditorGUI.BeginChangeCheck(); + enabled = EditorGUILayout.Toggle($"Overwrite rim lighting {j}", enabled); + EditorGUI.EndChangeCheck(); + bc.floatValue = enabled ? 1.0f : 0.0f; + } + EditorGUI.indentLevel -= 1; } } diff --git a/globals.cginc b/globals.cginc index 980a31a..b02507a 100644 --- a/globals.cginc +++ b/globals.cginc @@ -321,6 +321,10 @@ float4 _Matcap0Normal_ST; float _Matcap0Normal_Str; float _Matcap0Normal_UV_Select; #endif +float _Matcap0_Overwrite_Rim_Lighting_0; +float _Matcap0_Overwrite_Rim_Lighting_1; +float _Matcap0_Overwrite_Rim_Lighting_2; +float _Matcap0_Overwrite_Rim_Lighting_3; #endif #if defined(_MATCAP1) @@ -343,6 +347,10 @@ float4 _Matcap1Normal_ST; float _Matcap1Normal_Str; float _Matcap1Normal_UV_Select; #endif +float _Matcap1_Overwrite_Rim_Lighting_0; +float _Matcap1_Overwrite_Rim_Lighting_1; +float _Matcap1_Overwrite_Rim_Lighting_2; +float _Matcap1_Overwrite_Rim_Lighting_3; #endif #if defined(_RIM_LIGHTING0) diff --git a/tooner.shader b/tooner.shader index 7eda029..80c1652 100644 --- a/tooner.shader +++ b/tooner.shader @@ -228,6 +228,10 @@ Shader "yum_food/tooner" _Matcap0Normal("Matcap normals", 2D) = "bump" {} _Matcap0Normal_Str("Matcap normals", Range(0, 10)) = 1 _Matcap0Normal_UV_Select("Matcap normals", Range(0, 3)) = 0 + _Matcap0_Overwrite_Rim_Lighting_0("Overwrite RL", Float) = 0 + _Matcap0_Overwrite_Rim_Lighting_1("Overwrite RL", Float) = 0 + _Matcap0_Overwrite_Rim_Lighting_2("Overwrite RL", Float) = 0 + _Matcap0_Overwrite_Rim_Lighting_3("Overwrite RL", Float) = 0 _Matcap1("Matcap", 2D) = "black" {} _Matcap1_Mask("Matcap mask", 2D) = "white" {} @@ -246,6 +250,10 @@ Shader "yum_food/tooner" _Matcap1Normal("Matcap normals", 2D) = "bump" {} _Matcap1Normal_Str("Matcap normals", Range(0, 10)) = 1 _Matcap1Normal_UV_Select("Matcap normals", Range(0, 3)) = 0 + _Matcap1_Overwrite_Rim_Lighting_0("Overwrite RL", Float) = 0 + _Matcap1_Overwrite_Rim_Lighting_1("Overwrite RL", Float) = 0 + _Matcap1_Overwrite_Rim_Lighting_2("Overwrite RL", Float) = 0 + _Matcap1_Overwrite_Rim_Lighting_3("Overwrite RL", Float) = 0 _Rim_Lighting0_Enabled("Enable rim lighting", Float) = 0 _Rim_Lighting0_Mode("Rim lighting mode", Float) = 0 @@ -491,7 +499,6 @@ Shader "yum_food/tooner" #include "tooner_lighting.cginc" ENDCG } - /* Pass { Tags { "RenderType" = "Opaque" @@ -562,7 +569,6 @@ Shader "yum_food/tooner" #include "mochie_shadow_caster.cginc" ENDCG } - */ } CustomEditor "ToonerGUI" } diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc index 34c1368..6267a2d 100644 --- a/tooner_lighting.cginc +++ b/tooner_lighting.cginc @@ -1266,7 +1266,7 @@ float4 effect(inout v2f i) matcap_theta = atan2(matcap_uv.y - 0.5, matcap_uv.x - 0.5); } #endif - float matcap_overwrite_mask = 0; + float4 matcap_overwrite_mask = 0; #if defined(_MATCAP0) || defined(_MATCAP1) { #if defined(_MATCAP0) @@ -1337,7 +1337,7 @@ float4 effect(inout v2f i) albedo.rgb *= lerp(1, matcap, matcap_mask); break; case 2: - matcap_overwrite_mask = max(matcap_mask, matcap_overwrite_mask); + matcap_overwrite_mask[0] = max(matcap_mask, matcap_overwrite_mask[0]); albedo.rgb = lerp(albedo.rgb, matcap, matcap_mask); matcap_emission = lerp(albedo.rgb, matcap, matcap_mask) * _Matcap0Emission; break; @@ -1427,7 +1427,7 @@ float4 effect(inout v2f i) albedo.rgb *= lerp(1, matcap, matcap_mask); break; case 2: - matcap_overwrite_mask = max(matcap_mask, matcap_overwrite_mask); + matcap_overwrite_mask[1] = max(matcap_mask, matcap_overwrite_mask[1]); albedo.rgb = lerp(albedo.rgb, matcap, matcap_mask); matcap_emission = lerp(albedo.rgb, matcap, matcap_mask) * _Matcap1Emission; break; @@ -1450,10 +1450,12 @@ float4 effect(inout v2f i) #endif // _MATCAP1 } #endif // _MATCAP0 || _MATCAP1 + matcap_overwrite_mask = 1 - matcap_overwrite_mask; // TODO get rid of the pow. It's a hack to make matcap replace mode look // better with overlay tattoos. - mixOverlayAlbedoRoughnessMetallic(albedo, roughness, metallic, ov, 1 - pow(matcap_overwrite_mask, 4)); + mixOverlayAlbedoRoughnessMetallic(albedo, roughness, metallic, ov, + 1 - pow((1 - min(matcap_overwrite_mask[0], matcap_overwrite_mask[1])), 8)); #if defined(_DECAL0) || defined(_DECAL1) || defined(_DECAL2) || defined(_DECAL3) float3 decal_emission = 0; applyDecal(albedo, roughness, metallic, decal_emission, i); @@ -1484,6 +1486,16 @@ float4 effect(inout v2f i) #else float matcap_mask = 1; #endif +#if defined(_MATCAP0) + if (_Matcap0_Overwrite_Rim_Lighting_0) { + matcap_mask *= matcap_overwrite_mask[0]; + } +#endif +#if defined(_MATCAP1) + if (_Matcap1_Overwrite_Rim_Lighting_0) { + matcap_mask *= matcap_overwrite_mask[1]; + } +#endif #if defined(_RIM_LIGHTING0_POLAR_MASK) if (_Rim_Lighting0_PolarMask_Enabled) { float pmask_theta = _Rim_Lighting0_PolarMask_Theta; @@ -1548,6 +1560,16 @@ float4 effect(inout v2f i) #else float matcap_mask = 1; #endif +#if defined(_MATCAP0) + if (_Matcap0_Overwrite_Rim_Lighting_1) { + matcap_mask *= matcap_overwrite_mask[0]; + } +#endif +#if defined(_MATCAP1) + if (_Matcap1_Overwrite_Rim_Lighting_1) { + matcap_mask *= matcap_overwrite_mask[1]; + } +#endif #if defined(_RIM_LIGHTING1_POLAR_MASK) if (_Rim_Lighting1_PolarMask_Enabled) { float pmask_theta = _Rim_Lighting1_PolarMask_Theta; @@ -1616,6 +1638,16 @@ float4 effect(inout v2f i) #else float matcap_mask = 1; #endif +#if defined(_MATCAP0) + if (_Matcap0_Overwrite_Rim_Lighting_2) { + matcap_mask *= matcap_overwrite_mask[0]; + } +#endif +#if defined(_MATCAP1) + if (_Matcap1_Overwrite_Rim_Lighting_2) { + matcap_mask *= matcap_overwrite_mask[1]; + } +#endif #if defined(_RIM_LIGHTING2_POLAR_MASK) if (_Rim_Lighting2_PolarMask_Enabled) { float pmask_theta = _Rim_Lighting2_PolarMask_Theta; @@ -1684,6 +1716,16 @@ float4 effect(inout v2f i) #else float matcap_mask = 1; #endif +#if defined(_MATCAP0) + if (_Matcap0_Overwrite_Rim_Lighting_3) { + matcap_mask *= matcap_overwrite_mask[0]; + } +#endif +#if defined(_MATCAP1) + if (_Matcap1_Overwrite_Rim_Lighting_3) { + matcap_mask *= matcap_overwrite_mask[1]; + } +#endif #if defined(_RIM_LIGHTING3_POLAR_MASK) if (_Rim_Lighting3_PolarMask_Enabled) { float pmask_theta = _Rim_Lighting3_PolarMask_Theta; @@ -1821,6 +1863,7 @@ float4 effect(inout v2f i) #endif #if defined(_GLITTER) float glitter_mask = _Glitter_Mask.SampleGrad(linear_repeat_s, i.uv0, iddx, iddy); + glitter_mask *= min(matcap_overwrite_mask[0], matcap_overwrite_mask[1]); float glitter = get_glitter(i.uv0, i.worldPos, normal, _Glitter_Density, _Glitter_Amount, _Glitter_Speed, glitter_mask, _Glitter_Brightness, _Glitter_Angle, _Glitter_Power); |
