在UGUI或者Sprite中,有图片作为遮罩层的情况,但是因为使用了SpriteAtlas,会造成取得的遮罩的uv是错误的。
所以我们需要得到正确的uv。
有两种方式,其实算法都一样,目的就是获取正确的遮罩层的uv。
第一种,通过外部传入一个vector4的值
在c#中,对材质传递Sprite信息值
if (img.sprite)
{
Sprite sprite = img.sprite;
Vector4 result = new Vector4(sprite.textureRect.min.x / sprite.texture.width,
sprite.textureRect.min.y / sprite.texture.height,
sprite.textureRect.max.x / sprite.texture.width,
sprite.textureRect.max.y / sprite.texture.height);
img.material = Instantiate(heroIcon.material);
img.material.SetVector("_Rect", result);
}
在shader中,自然需要一个_Rect来接收
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Filter2D/Unlit/UGUI 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
[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
_Gray("Gray Progress",Range(0,1)) = 1
}
SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
"CanUseSpriteAtlas"="True"
}
Stencil
{