我正在尝试将掩码应用于从UnityEngine.UI.Image组件中使用的大纹理(精灵模式“多个”)中剪切出的精灵,到目前为止,结果并不令人满意。
以下是我使用的着色器,我将其复制到here。
Shader "UI/Mask"
{
Properties
{
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
_MaskTex ("Mask Texture", 2D) = "white" {}
_Color ("Tint", Color) = (1,1,1,1)
_StencilComp ("Stencil Comparison", Float) = 8
_Stencil ("Stencil ID", Float) = 0
_StencilOp ("Stencil Operation", Float) = 0
_StencilWriteMask ("Stencil Write Mask", Float) = 255
_StencilReadMask ("Stencil Read Mask", Float) = 255
_ColorMask ("Color Mask", Float) = 15
}
SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
"CanUseSpriteAtlas"="True"
}
Stencil
{
Ref [_Stencil]
Comp [_StencilComp]
Pass [_StencilOp]
ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask]
}
Cull Off
Lighting Off
ZWrite Off
ZTest [unity_GUIZTestMode]
Blend SrcAlpha OneMinusSrcAlpha
ColorMask [_ColorMask]
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata_t
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
half2 texcoord : TEXCOORD0;
};
fixed4 _Color;
v2f vert(appdata_t IN)
{
v2f OUT;
OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
OUT.texcoord = IN.texcoord;
#ifdef UNITY_HALF_TEXEL_OFFSET
OUT.vertex.xy += (_ScreenParams.zw-1.0)*float2(-1,1);
#endif
OUT.color = IN.color * _Color;
return OUT;
}
sampler2D _MainTex;
sampler2D _MaskTex;
fixed4 frag(v2f IN) : SV_Target
{
half4 color = tex2D(_MainTex, IN.texcoord) * IN.color;
half4 mask = tex2D(_MaskTex, IN.texcoord);
color.a *= mask.r;
clip (color.a - 0.01);
return color;
}
ENDCG
}
}
}
我有一条纹理,我切成了单独的精灵。下图显示了前两个图标,存储在同一个PNG中。
接下来,我按照link答案的说明进行操作,并准备了一个遮罩PNG,它只是一个半径为128像素的黑色边框圆圈。
然后准备材料......
并申请。
这就是我所拥有的:
我很遗憾我对着色器一无所知,所以我不知道我是否正确地描述了这个问题......但显然,圆形面罩被压扁/拉伸并应用于长条纹纹理,而不是应用于剪切的各个图标。
换句话说,完整的条带如下所示:
但Unity正在这样做:
然后它会从错误遮盖的纹理中删除每个图标供我使用。
可以对着色器进行哪些操作以使其正确遮罩?所以我应该看到这样的事情:
或者没有简单的方法,因为这是材料应该如何工作所以我必须给Unity单独的纹理而不是将所有图标存储在一个长条中?
答案 0 :(得分:1)
好的,这是一种陪审团操纵的解决方案。 首先,您为掩码使用的圆形图像需要将其纹理包装模式设置为重复。
然后,找到这行代码:
half4 mask = tex2D(_MaskTex, IN.texcoord);
在它之前插入这行代码:
IN.texcoord.x *= 9;
half4 mask = tex2D(_MaskTex, IN.texcoord);
这将使你的一个圆圈超过9个精灵变成9个圆圈,重复超过9个精灵。 (如果你有超过9个精灵,你需要改变它。)
希望这有帮助!