Unity3d Unity UI-将遮罩应用于单个精灵而不是整个纹理

Unity3d Unity UI-将遮罩应用于单个精灵而不是整个纹理,unity3d,shader,sprite,mask,Unity3d,Shader,Sprite,Mask,我正在尝试将遮罩应用于从大纹理(精灵模式“多重”)中剪切出来的精灵,该纹理将在UnityEngine.UI.Image组件中使用,但到目前为止,结果并不令人满意 这是我正在使用的着色器,我复制了它 我有一条纹理,我把它切割成单独的精灵。下图显示了存储在同一PNG中的前两个图标 接下来,我按照答案上的说明准备了一个蒙版PNG,它是一个半径为128像素的黑边圆 然后准备材料 并应用 这是我得到的: 我很遗憾,我没有关于着色器的知识,所以我不知道我是否正确地描述了这个问题。。。但很明显,圆形

我正在尝试将遮罩应用于从大纹理(精灵模式“多重”)中剪切出来的精灵,该纹理将在UnityEngine.UI.Image组件中使用,但到目前为止,结果并不令人满意

这是我正在使用的着色器,我复制了它

我有一条纹理,我把它切割成单独的精灵。下图显示了存储在同一PNG中的前两个图标

接下来,我按照答案上的说明准备了一个蒙版PNG,它是一个半径为128像素的黑边圆

然后准备材料

并应用

这是我得到的:

我很遗憾,我没有关于着色器的知识,所以我不知道我是否正确地描述了这个问题。。。但很明显,圆形遮罩被挤压/拉伸并应用于纹理的长条,而不是应用于剪切的单个图标

换言之,整个条形图如下所示:

但团结就是这样做的:

然后它从错误遮罩的纹理中剪切出每个图标供我使用

可以对着色器执行哪些操作以使其正确遮罩?所以我应该看到这样的情况:


或者没有简单的方法,因为这就是材料的工作原理,所以我必须为Unity提供单独的纹理,而不是将所有图标存储在一个长条中?

好吧,这里有一种操纵陪审团的解决方案。 首先,用于遮罩的圆形图像需要将其纹理包裹模式设置为“重复”

然后,找到这行代码:

half4 mask = tex2D(_MaskTex, IN.texcoord);
并在其前面插入这行代码:

IN.texcoord.x *= 9;
half4 mask = tex2D(_MaskTex, IN.texcoord);
这将把你在9个精灵上的一个圆圈变成在9个精灵上重复的9个圆圈。(如果您有9个以上的精灵,则需要更改此设置。)


希望这有帮助

尝试勾选保存方面。这将使圆保持为圆。您可能需要确定它的大小和位置。看起来两个项目都使用了相同的遮罩,因为老师似乎占据了优势,而学生占据了更多的中心部分。您需要两个面具实例。谢谢您的回复,但“保留方面”似乎不起作用。也许我的阐述不够清楚。我又添加了两张图片来详细说明这个问题。这就解释了为什么教师按钮占据了边缘,而学生按钮占据了更多的中心部分。你是说在我的Unity项目中,我使用的N个图标中的每一个都需要N个材质实例吗?它看起来像是在一个主对象下有按钮,而该对象有遮罩。您需要的层次结构是一个主对象,然后在下面有N个遮罩对象,每个遮罩对象都有一个遮罩组件和一个带有保留纵横比的图像,然后在每个遮罩对象下面有N个对象和教师/学生,依此类推。每个遮罩将覆盖其自己的子对象。哦。恐怕你误解了。我没有使用UI掩码系统,因为它的别名问题()尚未修复。这就是为什么我求助于使用着色器来遮罩精灵。这很有效。对于我的例子,它在.texcoord.x*=10;IN.texcoord.y*=2。。。因为我每行有10个图标,我有2行。虽然它肯定能工作,但这个面具只能为这个特殊的2 x 10图标地图服务,如果用在其他任何东西上,它会画出有趣的形状。
IN.texcoord.x *= 9;
half4 mask = tex2D(_MaskTex, IN.texcoord);