前段时间由于项目打包生成的apk太大,所以引入了Alpha通道分离,后面在用的时候发现实际效果不是那么理想就移除了,但还是觉得有必要记录一下
前言
我们都知道,一个图片有RGBA四个通道,其中R红色、G绿色、B蓝色、A透明度
如果一个图片包含透明像素,那么它就可以进行Alpha通道分离,将一张图片的RGB通道和Alpha通道分离开来
图片分离的Shader
- 目前项目使用的NGUI,将以下Shader从NGUI中拷贝至一个新的文件夹中,文件夹自己命名
Unlit - Transparent Colored
Unlit - Transparent Colored (TextureClip)
Unlit - Transparent Colored 1
Unlit - Transparent Colored 2
Unlit - Transparent Colored 3
- 新的Shader我们重新命名一下,我在中间加了一个
Devide
(随意)
但是所有的Shader,需要有一样的开头,结尾则和NGUI一致,如下:(Devide可以替换)
Unlit - Transparent Colored Divide
Unlit - Transparent Colored Divide (TextureClip)
Unlit - Transparent Colored Divide 1
Unlit - Transparent Colored Divide 2
Unlit - Transparent Colored Divide 3
- 这样做的原因,是因为我们需要替换NGUIAtlas的Material上面的Shader
这是NGUI原有的Shader之一,Unlit - Transparent Colored 1
在NGUI的UIDrawCall.cs
中,有一段代码
我们可以发现,它是按照”Hidden/Unlit/xxxxx x”前缀来动态查找对应的Shader使用的
if (shaderName.StartsWith("Hidden/"))
shaderName = shaderName.Substring(7);
// Legacy functionality
const string soft = " (SoftClip)";
shaderName = shaderName.Replace(soft, "");
const string textureClip = " (TextureClip)";
shaderName = shaderName.Replace(textureClip, "");
if (panel != null && panel.clipping == Clipping.TextureMask)
{
mTextureClip = true;
shader = Shader.Find("Hidden/" + shaderName + textureClip);
}
else if (mClipCount != 0)
{
shader = Shader.Find("Hidden/" + shaderName + " " + mClipCount);
if (shader == null) shader = Shader.Find(shaderName + " " + mClipCount);
// Legacy functionality
if (shader == null && mClipCount == 1)
{
mLegacyShader = true;
shader = Shader.Find(shaderName + soft);
}
}
else shader = Shader.Find(shaderName);
- 有以下几种情况是使用这些Shader的:
- 普通Sprite
- 在UIPanel中的Sprite
- 在UIPanel中的Sprite,以Texture遮盖
- 在UIPanel中的Sprite,在边缘渐变过渡遮盖
- 在UIPanel中的Sprite,在边缘直接遮盖
对应UIPanel选项如下:
由此可见上面查找的几种Shader,是会在这几个地方用到, 我们需要修改的Shader也正是这几个.
如果还有其他情况,那么找到对应的Shader拷贝过来修改就是了。修改方法如下