【发布时间】:2016-01-19 01:44:29
【问题描述】:
我正在尝试将蒙版应用于从要在 UnityEngine.UI.Image 组件中使用的大型纹理(sprite 模式“多个”)中剪切出来的 sprite,但到目前为止结果并不令人满意。
这是我正在使用的着色器,我从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 提供单独的纹理,而不是将所有图标存储在一个长条中?
【问题讨论】:
-
尝试勾选保留方面。这将使圆圈保持为圆圈。您可能必须修复它的大小和位置。看起来您对这两个项目都使用了相同的掩码,因为老师似乎获得了优势,而学生获得了更多的中心部分。您需要两个掩码实例。
-
感谢您的回复,但保留方面似乎不起作用。也许我的阐述不够清楚。我添加了另外两张图片来详细说明问题。这应该可以解释为什么教师按钮获得优势,而学生按钮获得更多的中心部分。你的意思是我需要在我的 Unity 项目中为我使用的 N 个图标中的每一个提供 N 个 Material 实例吗?
-
看起来你的按钮在一个主要对象下,而那个对象有掩码。您需要的层次结构是一个主要对象,然后在您的下面有 N 个掩码对象,每个对象都有一个掩码组件和具有保留方面的图像,然后在每个对象下面有 N 个带有教师/学生的对象,依此类推。每个遮罩都会覆盖它自己的子对象。
-
哦。恐怕你误会了。我没有使用 UI 掩码系统,因为它存在尚未修复的别名问题 (answers.unity3d.com/questions/942614/…)。这就是为什么我要使用着色器来掩盖精灵。
标签: unity3d shader sprite mask