From 1a62981f052ca321ca47627d41cda83e8ea60420 Mon Sep 17 00:00:00 2001 From: yum Date: Mon, 27 May 2024 13:28:38 -0700 Subject: Add mix modes to PBR overlay albedo channel --- Editor/tooner.cs | 23 +++++++++++++++++++ tooner.shader | 20 ++++++++++++++++ tooner_lighting.cginc | 63 +++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 94 insertions(+), 12 deletions(-) diff --git a/Editor/tooner.cs b/Editor/tooner.cs index 184b653..f984f6a 100644 --- a/Editor/tooner.cs +++ b/Editor/tooner.cs @@ -98,6 +98,13 @@ public class ToonerGUI : ShaderGUI { SetKeyword("_ROUGHNESS_MAP", bct.textureValue); } + enum PbrAlbedoMixMode { + AlphaBlend, + Add, + Min, + Max + }; + void DoPBROverlay() { for (int i = 0; i < 4; i++) { GUILayout.Label($"PBR overlay {i}", EditorStyles.boldLabel); @@ -123,6 +130,22 @@ public class ToonerGUI : ShaderGUI { } SetKeyword($"_PBR_OVERLAY{i}_BASECOLOR_MAP", bct.textureValue); + EditorGUI.BeginChangeCheck(); + bc = FindProperty($"_PBR_Overlay{i}_Mix"); + PbrAlbedoMixMode mode = (PbrAlbedoMixMode) Math.Round(bc.floatValue); + mode = (PbrAlbedoMixMode) EditorGUILayout.EnumPopup( + MakeLabel("Mix mode"), mode); + if (EditorGUI.EndChangeCheck()) { + RecordAction($"PBR overlay mix mode {i}"); + foreach (Material m in editor.targets) { + m.SetFloat($"_PBR_Overlay{i}_Mix", (int) mode); + } + } + SetKeyword($"_PBR_OVERLAY{i}_MIX_ALPHA_BLEND", mode == PbrAlbedoMixMode.AlphaBlend); + SetKeyword($"_PBR_OVERLAY{i}_MIX_ADD", mode == PbrAlbedoMixMode.Add); + SetKeyword($"_PBR_OVERLAY{i}_MIX_MIN", mode == PbrAlbedoMixMode.Min); + SetKeyword($"_PBR_OVERLAY{i}_MIX_MAX", mode == PbrAlbedoMixMode.Max); + bct = FindProperty($"_PBR_Overlay{i}_NormalTex"); editor.TexturePropertySingleLine( MakeLabel(bct, "Normal"), diff --git a/tooner.shader b/tooner.shader index 3ad48ab..256bfc1 100644 --- a/tooner.shader +++ b/tooner.shader @@ -22,6 +22,7 @@ Shader "yum_food/tooner" _PBR_Overlay0_Tex_NormalStr("Normal texture strength", Range(0, 10)) = 1 _PBR_Overlay0_Mask("Mask", 2D) = "white" {} _PBR_Overlay0_Mask_Invert("Mask invert", Float) = 0.0 + _PBR_Overlay0_Mix("Mix mode", Float) = 0.0 _PBR_Overlay1_Enable("Enable PBR overlay", Float) = 0.0 _PBR_Overlay1_BaseColor("Base color", Color) = (0.8, 0.8, 0.8, 1) @@ -34,6 +35,7 @@ Shader "yum_food/tooner" _PBR_Overlay1_Tex_NormalStr("Normal texture strength", Range(0, 10)) = 1 _PBR_Overlay1_Mask("Mask", 2D) = "white" {} _PBR_Overlay1_Mask_Invert("Mask invert", Float) = 0.0 + _PBR_Overlay1_Mix("Mix mode", Float) = 0.0 _PBR_Overlay2_Enable("Enable PBR overlay", Float) = 0.0 _PBR_Overlay2_BaseColor("Base color", Color) = (0.8, 0.8, 0.8, 1) @@ -46,6 +48,7 @@ Shader "yum_food/tooner" _PBR_Overlay2_Tex_NormalStr("Normal texture strength", Range(0, 10)) = 1 _PBR_Overlay2_Mask("Mask", 2D) = "white" {} _PBR_Overlay2_Mask_Invert("Mask invert", Float) = 0.0 + _PBR_Overlay2_Mix("Mix mode", Float) = 0.0 _PBR_Overlay3_Enable("Enable PBR overlay", Float) = 0.0 _PBR_Overlay3_BaseColor("Base color", Color) = (0.8, 0.8, 0.8, 1) @@ -58,6 +61,7 @@ Shader "yum_food/tooner" _PBR_Overlay3_Tex_NormalStr("Normal texture strength", Range(0, 10)) = 1 _PBR_Overlay3_Mask("Mask", 2D) = "white" {} _PBR_Overlay3_Mask_Invert("Mask invert", Float) = 0.0 + _PBR_Overlay3_Mix("Mix mode", Float) = 0.0 [NoScaleOffset] _EmissionTex("Emission map", 2D) = "black" {} _EmissionStrength("Emission strength", Range(0, 2)) = 0 @@ -231,24 +235,40 @@ Shader "yum_food/tooner" #pragma shader_feature_local _ _PBR_OVERLAY0_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY0_METALLIC_MAP #pragma shader_feature_local _ _PBR_OVERLAY0_MASK + #pragma shader_feature_local _ _PBR_OVERLAY0_MIX_ALPHA_BLEND + #pragma shader_feature_local _ _PBR_OVERLAY0_MIX_ADD + #pragma shader_feature_local _ _PBR_OVERLAY0_MIX_MIN + #pragma shader_feature_local _ _PBR_OVERLAY0_MIX_MAX #pragma shader_feature_local _ _PBR_OVERLAY1 #pragma shader_feature_local _ _PBR_OVERLAY1_BASECOLOR_MAP #pragma shader_feature_local _ _PBR_OVERLAY1_NORMAL_MAP #pragma shader_feature_local _ _PBR_OVERLAY1_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY1_METALLIC_MAP #pragma shader_feature_local _ _PBR_OVERLAY1_MASK + #pragma shader_feature_local _ _PBR_OVERLAY1_MIX_ALPHA_BLEND + #pragma shader_feature_local _ _PBR_OVERLAY1_MIX_ADD + #pragma shader_feature_local _ _PBR_OVERLAY1_MIX_MIN + #pragma shader_feature_local _ _PBR_OVERLAY1_MIX_MAX #pragma shader_feature_local _ _PBR_OVERLAY2 #pragma shader_feature_local _ _PBR_OVERLAY2_BASECOLOR_MAP #pragma shader_feature_local _ _PBR_OVERLAY2_NORMAL_MAP #pragma shader_feature_local _ _PBR_OVERLAY2_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY2_METALLIC_MAP #pragma shader_feature_local _ _PBR_OVERLAY2_MASK + #pragma shader_feature_local _ _PBR_OVERLAY2_MIX_ALPHA_BLEND + #pragma shader_feature_local _ _PBR_OVERLAY2_MIX_ADD + #pragma shader_feature_local _ _PBR_OVERLAY2_MIX_MIN + #pragma shader_feature_local _ _PBR_OVERLAY2_MIX_MAX #pragma shader_feature_local _ _PBR_OVERLAY3 #pragma shader_feature_local _ _PBR_OVERLAY3_BASECOLOR_MAP #pragma shader_feature_local _ _PBR_OVERLAY3_NORMAL_MAP #pragma shader_feature_local _ _PBR_OVERLAY3_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY3_METALLIC_MAP #pragma shader_feature_local _ _PBR_OVERLAY3_MASK + #pragma shader_feature_local _ _PBR_OVERLAY3_MIX_ALPHA_BLEND + #pragma shader_feature_local _ _PBR_OVERLAY3_MIX_ADD + #pragma shader_feature_local _ _PBR_OVERLAY3_MIX_MIN + #pragma shader_feature_local _ _PBR_OVERLAY3_MIX_MAX #pragma shader_feature_local _ _LTCGI #pragma shader_feature_local _ _TESSELLATION #pragma shader_feature_local _ _MATCAP0_DISTORTION0 diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc index 6a0dd87..f746fbf 100644 --- a/tooner_lighting.cginc +++ b/tooner_lighting.cginc @@ -482,6 +482,56 @@ void getOverlayAlbedo(inout PbrOverlay ov, #endif // _PBR_OVERLAY3 } +void mixOverlayAlbedo(inout float3 albedo, PbrOverlay ov) { +#if defined(_PBR_OVERLAY0) +#if defined(_PBR_OVERLAY0_MIX_ALPHA_BLEND) + albedo.rgb = lerp(albedo.rgb, ov.ov0_albedo.rgb, ov.ov0_albedo.a); +#elif defined(_PBR_OVERLAY0_MIX_ADD) + albedo.rgb += ov.ov0_albedo; +#elif defined(_PBR_OVERLAY0_MIX_MIN) + albedo.rgb = min(albedo.rgb, ov.ov0_albedo); +#elif defined(_PBR_OVERLAY0_MIX_MAX) + albedo.rgb = max(albedo.rgb, ov.ov0_albedo); +#endif +#endif + +#if defined(_PBR_OVERLAY1) +#if defined(_PBR_OVERLAY1_MIX_ALPHA_BLEND) + albedo.rgb = lerp(albedo.rgb, ov.ov1_albedo.rgb, ov.ov1_albedo.a); +#elif defined(_PBR_OVERLAY1_MIX_ADD) + albedo.rgb += ov.ov1_albedo; +#elif defined(_PBR_OVERLAY1_MIX_MIN) + albedo.rgb = min(albedo.rgb, ov.ov1_albedo); +#elif defined(_PBR_OVERLAY1_MIX_MAX) + albedo.rgb = max(albedo.rgb, ov.ov1_albedo); +#endif +#endif + +#if defined(_PBR_OVERLAY2) +#if defined(_PBR_OVERLAY2_MIX_ALPHA_BLEND) + albedo.rgb = lerp(albedo.rgb, ov.ov2_albedo.rgb, ov.ov2_albedo.a); +#elif defined(_PBR_OVERLAY2_MIX_ADD) + albedo.rgb += ov.ov2_albedo; +#elif defined(_PBR_OVERLAY2_MIX_MIN) + albedo.rgb = min(albedo.rgb, ov.ov2_albedo); +#elif defined(_PBR_OVERLAY2_MIX_MAX) + albedo.rgb = max(albedo.rgb, ov.ov2_albedo); +#endif +#endif + +#if defined(_PBR_OVERLAY3) +#if defined(_PBR_OVERLAY3_MIX_ALPHA_BLEND) + albedo.rgb = lerp(albedo.rgb, ov.ov3_albedo.rgb, ov.ov3_albedo.a); +#elif defined(_PBR_OVERLAY3_MIX_ADD) + albedo.rgb += ov.ov3_albedo; +#elif defined(_PBR_OVERLAY3_MIX_MIN) + albedo.rgb = min(albedo.rgb, ov.ov3_albedo); +#elif defined(_PBR_OVERLAY3_MIX_MAX) + albedo.rgb = max(albedo.rgb, ov.ov3_albedo); +#endif +#endif +} + void applyOverlayNormal(inout float3 raw_normal, PbrOverlay ov, v2f i, float iddx, float iddy) { float3 raw_normal_2; @@ -609,18 +659,7 @@ float4 effect(inout v2f i) float4 vertex_light_color = 0; #endif -#if defined(_PBR_OVERLAY0) - albedo.rgb = lerp(albedo.rgb, ov.ov0_albedo.rgb, ov.ov0_albedo.a); -#endif -#if defined(_PBR_OVERLAY1) - albedo.rgb = lerp(albedo.rgb, ov.ov1_albedo.rgb, ov.ov1_albedo.a); -#endif -#if defined(_PBR_OVERLAY2) - albedo.rgb = lerp(albedo.rgb, ov.ov2_albedo.rgb, ov.ov2_albedo.a); -#endif -#if defined(_PBR_OVERLAY3) - albedo.rgb = lerp(albedo.rgb, ov.ov3_albedo.rgb, ov.ov3_albedo.a); -#endif + mixOverlayAlbedo(albedo.rgb, ov); #if defined(_MATCAP0) || defined(_MATCAP1) || defined(_RIM_LIGHTING0) || defined(_RIM_LIGHTING1) float3 matcap_emission = 0; -- cgit v1.2.3