Unity5 UI图片变灰处理(UGUI)(二)


图片“变灰”处理是再寻常不过的要求了,特别按钮,头像等UI图片的“变灰”处理非常常见。比如:

网上已经有很多的实现方法,但是Unity5.3.8以后,对于使用sprite packer,并将包含透明通道的图片进行etc1格式压缩的图集来说,稍微有些不一样。新的uishader中,加入了

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

这段代码,用来获取指定位置上的透明通道。我认为unity是将透明通道单独提取出来进行保存,把剩下的rgb通道保存到另一张图片中进行etc压缩。
这就牵扯到图片变灰处理中的一些细节问题,如果我们的图集使用了etc1压缩方式,那么透明通道就需要单独获取,在fragment shader中,我们应该修改原先的操作为:

fixed4 frag(v2f IN) : SV_Target
{
    // 这里首先获取MainTex中的rgb颜色信息                          
    fixed4 colorTex = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
    
    // 之后获取AlphaTex中的透明通道信息,注意透明通道保存的在r通道中
    fixed AlphaTexAlpha = tex2D(_AlphaTex, IN.texcoord).r + _TextureSampleAdd.a;

    // 创建color变量,设置透明通道为colorTex.a和AlphaTexAlpha的乘积
    fixed4 color = fixed4(colorTex.rgb, colorTex.a * AlphaTexAlpha);
    color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
				
    #ifdef UNITY_UI_ALPHACLIP
    clip (color.a - 0.001);
    #endif

    color.rgb = Luminance(color.rgb);

    return color;
}

计算colorTex.a和AlphaTexAlpha的乘积是为了即使unity没有给我们传递_AlphaTex时,也能让图片正常显示,因为并不是所有的图片都按照sprite packer方式打包。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM