基于ETC+Alpha压缩的UGUI贴图Shader兼容方案

针对UGUI贴图采用ETC+Alpha压缩方式后,UI自定义Shader需要进行相应的兼容处理。

首先,通过 _AlphaTex 属性引入一张存储Alpha通道信息的纹理。

在Shader代码中,首先获取 _MainTex 中的RGB颜色信息,并与 _TextureSampleAdd 属性相加,得到最终的颜色值 colorTex

接着,从 _AlphaTex 中获取Alpha通道信息。需要注意的是,Alpha通道信息存储在纹理的R通道中。

最后,将 colorTex 的RGB通道与 colorTex.aAlphaTexAlpha 的乘积作为最终的Alpha通道,构建出新的颜色值 color

代码示例:

// PerRendererData
_AlphaTex("Sprite Alpha Texture", 2D) = "white" {}

// Shader代码片段
fixed4 colorTex = (tex2D(_MainTex, i.texcoord) + _TextureSampleAdd) * i.color;
fixed AlphaTexAlpha = tex2D(_AlphaTex, i.texcoord).r + _TextureSampleAdd.a;
fixed4 color = fixed4(colorTex.rgb, colorTex.a * AlphaTexAlpha);
color.a *= UnityGet2DClipping(i.worldPosition.xy, _ClipRect);
shader 文件大小:3.43KB