Bongo score 7911
2018/09/07 19:41 投稿
ビルトインシェーダーの`DefaultResourcesExtra/UI/UI-Default.shader`がご参考になりそうです。 |
この中に、いかにも怪しげな`UNITY_UI_CLIP_RECT`や`_ClipRect`、`UnityGet2DClipping`といったキーワードが出てきますが、どうやらこれらでマスク範囲内かどうかを判定できるようです。 |
たとえば下記のようにしてみるといかがでしょうか? |
```ShaderLab |
Shader "Sprites/Default_Custom" |
{ |
Properties |
{ |
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} |
_Color ("Tint", Color) = (1,1,1,1) |
[MaterialToggle] PixelSnap ("Pixel snap", Float) = 0 |
} |
SubShader |
{ |
Tags |
{ |
"Queue"="Transparent" |
"IgnoreProjector"="True" |
"RenderType"="Transparent" |
"PreviewType"="Plane" |
"CanUseSpriteAtlas"="True" |
} |
Cull Off |
Lighting Off |
ZWrite Off |
Blend One OneMinusSrcAlpha |
Pass |
{ |
CGPROGRAM |
#pragma vertex vert |
#pragma fragment frag |
#pragma target 2.0 |
#pragma multi_compile _ PIXELSNAP_ON |
#pragma multi_compile _ ETC1_EXTERNAL_ALPHA |
// 追加 |
#include "UnityUI.cginc" |
// 追加 |
#pragma multi_compile __ UNITY_UI_CLIP_RECT |
#include "UnityCG.cginc" |
// 追加 |
#include "UnityUI.cginc" |
struct appdata_t |
{ |
float4 vertex : POSITION; |
float4 color : COLOR; |
float2 texcoord : TEXCOORD0; |
}; |
struct v2f |
{ |
float4 vertex : SV_POSITION; |
fixed4 color : COLOR; |
float2 texcoord : TEXCOORD0; |
float4 worldPosition : TEXCOORD1; // 追加 |
}; |
fixed4 _Color; |
v2f vert(appdata_t IN) |
{ |
v2f OUT; |
OUT.vertex = UnityObjectToClipPos(IN.vertex); |
OUT.texcoord = IN.texcoord; |
OUT.worldPosition = IN.vertex; // 追加 |
OUT.color = IN.color * _Color; |
#ifdef PIXELSNAP_ON |
OUT.vertex = UnityPixelSnap (OUT.vertex); |
#endif |
return OUT; |
} |
sampler2D _MainTex; |
sampler2D _AlphaTex; |
float4 _ClipRect; // 追加 |
fixed4 SampleSpriteTexture (float2 uv) |
{ |
fixed4 color = tex2D (_MainTex, uv); |
#if ETC1_EXTERNAL_ALPHA |
// get the color from an external texture (usecase: Alpha support for ETC1 on android) |
color.a = tex2D (_AlphaTex, uv).r; |
#endif //ETC1_EXTERNAL_ALPHA |
return color; |
} |
fixed4 frag(v2f IN) : SV_Target |
{ |
fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color; |
// 追加 |
#ifdef UNITY_UI_CLIP_RECT |
c.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); |
clip (c.a - 0.001); |
#endif //UNITY_UI_CLIP_RECT |
c.rgb = c.rgb*2+max(fixed3(0,0,0),IN.color.rgb-0.5)*2; |
c.rgb *= c.a; |
return c; |
} |
ENDCG |
} |
} |
} |
``` |