diff options
| author | yum <yum.food.vr@gmail.com> | 2024-10-01 12:24:10 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2024-10-01 12:24:10 -0700 |
| commit | 77653b614a7285092973f0599a7d50a63b6d099f (patch) | |
| tree | a521010f104f1c6294de7f2cb9a83c3a2ee3f0d6 | |
| parent | 05ced295f10887c6b809ea43dab6cdd77e1fca8f (diff) | |
PBR overlays can now overwrite glitter
| -rw-r--r-- | Editor/tooner.cs | 7 | ||||
| -rw-r--r-- | globals.cginc | 4 | ||||
| -rw-r--r-- | tooner.shader | 4 | ||||
| -rw-r--r-- | tooner_lighting.cginc | 16 |
4 files changed, 27 insertions, 4 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs index ae51ae5..537de6c 100644 --- a/Editor/tooner.cs +++ b/Editor/tooner.cs @@ -387,6 +387,13 @@ public class ToonerGUI : ShaderGUI { bc, "UV channel"); + bc = FindProperty($"_PBR_Overlay{i}_Mask_Glitter"); + enabled = bc.floatValue > 1E-6; + EditorGUI.BeginChangeCheck(); + enabled = EditorGUILayout.Toggle("Mask glitter", enabled); + EditorGUI.EndChangeCheck(); + bc.floatValue = enabled ? 1.0f : 0.0f; + EditorGUI.BeginChangeCheck(); bc = FindProperty($"_PBR_Overlay{i}_Sampler_Mode"); SamplerMode sampler_mode = (SamplerMode) Math.Round(bc.floatValue); diff --git a/globals.cginc b/globals.cginc index 630d950..fd7c029 100644 --- a/globals.cginc +++ b/globals.cginc @@ -133,6 +133,7 @@ float _PBR_Overlay0_Alpha_Multiplier; float _PBR_Overlay0_UV_Select; float _PBR_Overlay0_Sampler_Mode; float _PBR_Overlay0_Mip_Bias; +float _PBR_Overlay0_Mask_Glitter; #endif #if defined(_PBR_OVERLAY1) @@ -164,6 +165,7 @@ float _PBR_Overlay1_Alpha_Multiplier; float _PBR_Overlay1_UV_Select; float _PBR_Overlay1_Sampler_Mode; float _PBR_Overlay1_Mip_Bias; +float _PBR_Overlay1_Mask_Glitter; #endif #if defined(_PBR_OVERLAY2) @@ -195,6 +197,7 @@ float _PBR_Overlay2_Alpha_Multiplier; float _PBR_Overlay2_UV_Select; float _PBR_Overlay2_Sampler_Mode; float _PBR_Overlay2_Mip_Bias; +float _PBR_Overlay2_Mask_Glitter; #endif #if defined(_PBR_OVERLAY3) @@ -226,6 +229,7 @@ float _PBR_Overlay3_Alpha_Multiplier; float _PBR_Overlay3_UV_Select; float _PBR_Overlay3_Sampler_Mode; float _PBR_Overlay3_Mip_Bias; +float _PBR_Overlay3_Mask_Glitter; #endif #if defined(_DECAL0) diff --git a/tooner.shader b/tooner.shader index ddfc5b1..eb42cdf 100644 --- a/tooner.shader +++ b/tooner.shader @@ -50,6 +50,7 @@ Shader "yum_food/tooner" _PBR_Overlay0_UV_Select("UV channel", Range(0,7)) = 0 _PBR_Overlay0_Sampler_Mode("Sampler mode", Range(0,1)) = 0 _PBR_Overlay0_Mip_Bias("Mip bias", Float) = 0.0 + _PBR_Overlay0_Mask_Glitter("Mask glitter", 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) @@ -74,6 +75,7 @@ Shader "yum_food/tooner" _PBR_Overlay1_UV_Select("UV channel", Range(0,7)) = 0 _PBR_Overlay1_Sampler_Mode("Sampler mode", Range(0,1)) = 0 _PBR_Overlay1_Mip_Bias("Mip bias", Float) = 0.0 + _PBR_Overlay1_Mask_Glitter("Mask glitter", 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) @@ -98,6 +100,7 @@ Shader "yum_food/tooner" _PBR_Overlay2_UV_Select("UV channel", Range(0,7)) = 0 _PBR_Overlay2_Sampler_Mode("Sampler mode", Range(0,1)) = 0 _PBR_Overlay2_Mip_Bias("Mip bias", Float) = 0.0 + _PBR_Overlay2_Mask_Glitter("Mask glitter", 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) @@ -122,6 +125,7 @@ Shader "yum_food/tooner" _PBR_Overlay3_UV_Select("UV channel", Range(0,7)) = 0 _PBR_Overlay3_Sampler_Mode("Sampler mode", Range(0,1)) = 0 _PBR_Overlay3_Mip_Bias("Mip bias", Float) = 0.0 + _PBR_Overlay3_Mask_Glitter("Mask glitter", Float) = 0.0 _Decal0_Enable("Enable decal", Float) = 0.0 _Decal0_BaseColor("Base color", 2D) = "white" {} diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc index 7c2028d..23804a4 100644 --- a/tooner_lighting.cginc +++ b/tooner_lighting.cginc @@ -1009,7 +1009,8 @@ void applyDecal(inout float4 albedo, void mixOverlayAlbedoRoughnessMetallic(inout float4 albedo, inout float roughness, inout float metallic, PbrOverlay ov, - float mask) { + float mask, out float glitter_mask) { + glitter_mask = 1; // Calculate alpha masks before we start mutating alpha. #if defined(_PBR_OVERLAY0) float a0 = saturate(ov.ov0_albedo.a * _PBR_Overlay0_Alpha_Multiplier); @@ -1020,6 +1021,7 @@ void mixOverlayAlbedoRoughnessMetallic(inout float4 albedo, } a0 *= mask; a0 *= ov.ov0_mask; + glitter_mask *= 1 - a0 * _PBR_Overlay0_Mask_Glitter; #endif #if defined(_PBR_OVERLAY1) float a1 = saturate(ov.ov1_albedo.a * _PBR_Overlay1_Alpha_Multiplier); @@ -1030,6 +1032,7 @@ void mixOverlayAlbedoRoughnessMetallic(inout float4 albedo, } a1 *= mask; a1 *= ov.ov1_mask; + glitter_mask *= 1 - a1 * _PBR_Overlay1_Mask_Glitter; #endif #if defined(_PBR_OVERLAY2) float a2 = saturate(ov.ov2_albedo.a * _PBR_Overlay2_Alpha_Multiplier); @@ -1040,6 +1043,7 @@ void mixOverlayAlbedoRoughnessMetallic(inout float4 albedo, } a2 *= mask; a2 *= ov.ov2_mask; + glitter_mask *= 1 - a2 * _PBR_Overlay2_Mask_Glitter; #endif #if defined(_PBR_OVERLAY3) float a3 = saturate(ov.ov3_albedo.a * _PBR_Overlay3_Alpha_Multiplier); @@ -1050,6 +1054,7 @@ void mixOverlayAlbedoRoughnessMetallic(inout float4 albedo, } a3 *= mask; a3 *= ov.ov3_mask; + glitter_mask *= 1 - a3 * _PBR_Overlay3_Mask_Glitter; #endif #if defined(_PBR_OVERLAY0) @@ -1654,8 +1659,10 @@ float4 effect(inout v2f i) // TODO get rid of the pow. It's a hack to make matcap replace mode look // better with overlay tattoos. + float overlay_glitter_mask; mixOverlayAlbedoRoughnessMetallic(albedo, roughness, metallic, ov, - 1 - pow((1 - min(matcap_overwrite_mask[0], matcap_overwrite_mask[1])), 8)); + 1 - pow((1 - min(matcap_overwrite_mask[0], matcap_overwrite_mask[1])), 8), + overlay_glitter_mask); #if defined(_DECAL0) || defined(_DECAL1) || defined(_DECAL2) || defined(_DECAL3) float3 decal_emission = 0; applyDecal(albedo, roughness, metallic, decal_emission, i); @@ -2187,9 +2194,10 @@ float4 effect(inout v2f i) #if defined(_GLITTER) float3 glitter_color_unlit; { - - float glitter_mask = _Glitter_Mask.SampleLevel(linear_repeat_s, i.uv0, /*lod=*/0); + float glitter_mask = + _Glitter_Mask.SampleLevel(linear_repeat_s, i.uv0, /*lod=*/0); glitter_mask *= min(matcap_overwrite_mask[0], matcap_overwrite_mask[1]); + glitter_mask *= overlay_glitter_mask; float glitter = get_glitter( get_uv_by_channel(i, round(_Glitter_UV_Select)), i.worldPos, i.centerCamPos, normal, |
