Skip to content

Commit

Permalink
feat: add 'SOFTMASKABLE' shader feature to improve shader build
Browse files Browse the repository at this point in the history
BREAKING CHANGE: SoftMaskable shaders now require the `SOFTMASKABLE` shader feature.
Please upgrade assets from `Project Settings > UI > Soft Mask` or refer to the 'README > Usage with Your Custom Shaders' section to manually update your shaders.
  • Loading branch information
mob-sakai committed Nov 23, 2024
1 parent 6c6ac59 commit eec3212
Show file tree
Hide file tree
Showing 9 changed files with 34 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ Shader "Hidden/UI/Additive (SoftMaskable)"
#include "UnityUI.cginc"

#include "Packages/com.coffee.softmask-for-ugui/Shaders/SoftMask.cginc" // Add for soft mask
#pragma multi_compile_local __ SOFTMASK_EDITOR // Add for soft mask
#pragma shader_feature_local _ SOFTMASK_EDITOR // Add for soft mask
#pragma shader_feature_local _ SOFTMASKABLE // Add for soft mask
#pragma multi_compile_local _ UNITY_UI_CLIP_RECT
#pragma multi_compile_local _ UNITY_UI_ALPHACLIP

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ Shader "UI/Additive (SoftMaskable)"
#include "UnityUI.cginc"

#include "Packages/com.coffee.softmask-for-ugui/Shaders/SoftMask.cginc" // Add for soft mask
#pragma multi_compile_local __ SOFTMASK_EDITOR // Add for soft mask
#pragma shader_feature_local _ SOFTMASK_EDITOR // Add for soft mask
#pragma shader_feature_local _ SOFTMASKABLE // Add for soft mask
#pragma multi_compile_local _ UNITY_UI_CLIP_RECT
#pragma multi_compile_local _ UNITY_UI_ALPHACLIP

Expand Down
6 changes: 2 additions & 4 deletions Packages/src/Runtime/Utilities/SoftMaskUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ internal static class SoftMaskUtils
private static Material s_SoftMaskingMaterialAdd;
private static Material s_SoftMaskingMaterialSub;
private static readonly int s_SoftMaskableStereo = Shader.PropertyToID("_SoftMaskableStereo");
private static readonly int s_SoftMaskableEnable = Shader.PropertyToID("_SoftMaskableEnable");
private static readonly int s_SoftMaskOutsideColor = Shader.PropertyToID("_SoftMaskOutsideColor");
private static readonly int s_SoftMaskTex = Shader.PropertyToID("_SoftMaskTex");
private static readonly int s_SoftMaskColor = Shader.PropertyToID("_SoftMaskColor");
Expand Down Expand Up @@ -115,7 +114,6 @@ private static void InitializeOnLoadMethod()
}
});
#endif

}

#if TMP_ENABLE
Expand Down Expand Up @@ -192,7 +190,7 @@ public static Material CreateSoftMaskable(
Profiler.BeginSample("(SM4UI)[SoftMaskableMaterial] Create > Create New Material");
var mat = new Material(baseMat)
{
shader = UISoftMaskProjectSettings.shaderRegistry.FindAliasShader(baseMat.shader,
shader = UISoftMaskProjectSettings.shaderRegistry.FindOptionalShader(baseMat.shader,
"Hidden/{0} (SoftMaskable)", "Hidden/UI/Default (SoftMaskable)"),
hideFlags = HideFlags.HideAndDontSave
};
Expand All @@ -201,13 +199,13 @@ public static Material CreateSoftMaskable(
Profiler.BeginSample("(SM4UI)[SoftMaskableMaterial] Create > Set Properties");
mat.SetTexture(s_SoftMaskTex, softMaskBuffer);
mat.SetInt(s_SoftMaskableStereo, isStereo ? 1 : 0);
mat.SetInt(s_SoftMaskableEnable, 1);
mat.SetVector(s_SoftMaskColor, new Vector4(
0 <= softMaskDepth ? 1 : 0,
1 <= softMaskDepth ? 1 : 0,
2 <= softMaskDepth ? 1 : 0,
3 <= softMaskDepth ? 1 : 0
));
mat.EnableKeyword("SOFTMASKABLE");
Profiler.EndSample();

#if UNITY_EDITOR
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,8 @@ SubShader {
#include "UnityUI.cginc"
#include "Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc"
#include "Packages/com.coffee.softmask-for-ugui/Shaders/SoftMask.cginc" // Add for soft mask
#pragma shader_feature_local _ SOFTMASK_EDITOR // Add for soft mask
#pragma shader_feature_local _ SOFTMASK_EDITOR // Add for soft mask
#pragma shader_feature_local _ SOFTMASKABLE // Add for soft mask

struct vertex_t {
UNITY_VERTEX_INPUT_INSTANCE_ID
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,8 @@ SubShader {
#include "Assets/TextMesh Pro/Shaders/TMPro.cginc"

#include "Packages/com.coffee.softmask-for-ugui/Shaders/SoftMask.cginc" // Add for soft mask
#pragma shader_feature_local _ SOFTMASK_EDITOR // Add for soft mask
#pragma shader_feature_local _ SOFTMASK_EDITOR // Add for soft mask
#pragma shader_feature_local _ SOFTMASKABLE // Add for soft mask

struct vertex_t
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@ SubShader {
#include "UnityUI.cginc"
#include "Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc"
#include "Packages/com.coffee.softmask-for-ugui/Shaders/SoftMask.cginc" // Add for soft mask
#pragma shader_feature_local _ SOFTMASK_EDITOR // Add for soft mask
#pragma shader_feature_local _ SOFTMASK_EDITOR // Add for soft mask
#pragma shader_feature_local _ SOFTMASKABLE // Add for soft mask

struct vertex_t {
UNITY_VERTEX_INPUT_INSTANCE_ID
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,8 @@ SubShader {
#include "Assets/TextMesh Pro/Shaders/TMPro.cginc"

#include "Packages/com.coffee.softmask-for-ugui/Shaders/SoftMask.cginc" // Add for soft mask
#pragma shader_feature_local _ SOFTMASK_EDITOR // Add for soft mask
#pragma shader_feature_local _ SOFTMASK_EDITOR // Add for soft mask
#pragma shader_feature_local _ SOFTMASKABLE // Add for soft mask

struct vertex_t
{
Expand Down
1 change: 1 addition & 0 deletions Packages/src/Shaders/Hidden-UI-Default-SoftMaskable.shader
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ Shader "Hidden/UI/Default (SoftMaskable)"

#include "Packages/com.coffee.softmask-for-ugui/Shaders/SoftMask.cginc" // Add for soft mask
#pragma shader_feature_local _ SOFTMASK_EDITOR // Add for soft mask
#pragma shader_feature_local _ SOFTMASKABLE // Add for soft mask

struct appdata_t
{
Expand Down
39 changes: 19 additions & 20 deletions Packages/src/Shaders/SoftMask.cginc
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ uniform sampler2D _SoftMaskTex;
uniform half4 _SoftMaskColor;
uniform float _AlphaClipThreshold;
uniform float4 _SoftMaskOutsideColor;
uniform int _SoftMaskableEnable;
uniform int _SoftMaskableStereo;
uniform float4x4 _GameVP;
uniform float4x4 _GameTVP;
Expand Down Expand Up @@ -49,7 +48,7 @@ float2 WorldToUv(float4 worldPos, float offset)
float2 ScreenToUv(const float2 screenPos)
{
half2 uv = screenPos;
#if UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION
#if UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION
float ratio = _ScreenParams.x / _ScreenParams.y;
switch (UNITY_DISPLAY_ORIENTATION_PRETRANSFORM)
{
Expand All @@ -60,34 +59,29 @@ float2 ScreenToUv(const float2 screenPos)
case UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_270:
return half2((uv.y + ratio - 1) / ratio, 1 - uv.x * ratio);
}
#endif
#endif

return uv;
}

float2 ClipToUv(const float2 clipPos)
{
half2 screenPos = clipPos / _ScreenParams.xy;
#if UNITY_UV_STARTS_AT_TOP
#if UNITY_UV_STARTS_AT_TOP
if (0 <= _ProjectionParams.x)
screenPos.y = 1 - screenPos.y;
#endif
#endif
return ScreenToUv(screenPos);
}

float SoftMaskSample(float2 uv, float a)
{
if (_SoftMaskableEnable == 0)
{
return 1;
}

if (_SoftMaskableStereo)
{
uv = lerp(half2(uv.x / 2, uv.y), half2(uv.x / 2 + 0.5, uv.y), unity_StereoEyeIndex);
}

#if !SOFTMASK_EDITOR
#if !SOFTMASK_EDITOR
if (_AllowRenderScale == 1)
{
uv /= _RenderScale;
Expand All @@ -96,15 +90,15 @@ float SoftMaskSample(float2 uv, float a)
{
uv /= _DynamicResolutionScale;
}
#endif
#endif
half4 mask = tex2D(_SoftMaskTex, uv);
half4 alpha = saturate(lerp(half4(1, 1, 1, 1),
lerp(mask, half4(1, 1, 1, 1) - mask, _SoftMaskColor - half4(1, 1, 1, 1)),
_SoftMaskColor));
#if SOFTMASK_EDITOR
#if SOFTMASK_EDITOR
int inScreen = step(0, uv.x) * step(uv.x, 1) * step(0, uv.y) * step(uv.y, 1);
alpha = lerp(_SoftMaskOutsideColor, alpha, inScreen);
#ifdef UNITY_UI_ALPHACLIP
#ifdef UNITY_UI_ALPHACLIP
if (_MaskingShapeSubtract == 1)
{
if (_SoftMaskInSceneView == 1)
Expand All @@ -114,15 +108,15 @@ float SoftMaskSample(float2 uv, float a)
}
clip (a * alpha.x * alpha.y * alpha.z * alpha.w - _AlphaClipThreshold - 0.001);
}
#endif
#endif
#endif
#endif

return pow(alpha.x * alpha.y * alpha.z * alpha.w, _SoftMaskingPower);
}

void SoftMaskForGraph_float(float4 ScreenPos, float4 WorldPos, float InAlpha, out float A)
{
#if SOFTMASK_EDITOR
#if SOFTMASK_EDITOR
if (_SoftMaskInGameView == 1)
{
A = SoftMaskSample(ScreenToUv(ScreenPos.xy), 1) * InAlpha;
Expand All @@ -135,12 +129,16 @@ void SoftMaskForGraph_float(float4 ScreenPos, float4 WorldPos, float InAlpha, ou
{
A = SoftMaskSample(WorldToUv(WorldPos, 0.5), InAlpha) * InAlpha;
}
#else
#else
A = SoftMaskSample(ScreenToUv(ScreenPos.xy), 1) * InAlpha;
#endif
#endif
}

#if SOFTMASK_EDITOR
#if !SOFTMASKABLE
#define EDITOR_ONLY(_)
#define SOFTMASK_EDITOR_ONLY(_)
#define SoftMask(_, __, ___) 1
#elif SOFTMASK_EDITOR
#define EDITOR_ONLY(x) x
#define SOFTMASK_EDITOR_ONLY(x) x
#define SoftMask(_, worldPos, alpha) SoftMaskSample(WorldToUv(worldPos, 0.5), alpha)
Expand All @@ -149,4 +147,5 @@ void SoftMaskForGraph_float(float4 ScreenPos, float4 WorldPos, float InAlpha, ou
#define SOFTMASK_EDITOR_ONLY(_)
#define SoftMask(clipPos, _, __) SoftMaskSample(ClipToUv(clipPos), 1)
#endif
#else
#endif // UI_SOFT_MASK_INCLUDED

0 comments on commit eec3212

Please sign in to comment.