summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2024-05-27 13:28:38 -0700
committeryum <yum.food.vr@gmail.com>2024-05-27 13:28:38 -0700
commit1a62981f052ca321ca47627d41cda83e8ea60420 (patch)
tree3f9c36933b8414459a0a8c335ab2a41c148211bb
parent33b2b8a3ab0ddea85c7a3f03f918fe5ee6874426 (diff)
Add mix modes to PBR overlay albedo channel
-rw-r--r--Editor/tooner.cs23
-rw-r--r--tooner.shader20
-rw-r--r--tooner_lighting.cginc63
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;