版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jingangxin666/article/details/80714696
NGUI的Atlas Maker
视图中, 有一个选项是 PMA Shader
打开NGUI源码, 发现在UIAtlasMaker.OnGUI
中有一段代码
if (!fixedShader)
{
GUILayout.BeginHorizontal();
NGUISettings.atlasPMA = EditorGUILayout.Toggle("PMA Shader", NGUISettings.atlasPMA, GUILayout.Width(100f));
GUILayout.Label("Pre-multiplied alpha", GUILayout.MinWidth(70f));
GUILayout.EndHorizontal();
}
其中NGUISettings.atlasPMA
影响到的是这段代码
// If the material doesn't exist, create it
if (mat == null)
{
Shader shader = Shader.Find(NGUISettings.atlasPMA ? "Unlit/Premultiplied Colored" : "Unlit/Transparent Colored");
mat = new Material(shader);
// Save the material
AssetDatabase.CreateAsset(mat, matPath);
AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport);
// Load the material so it's usable
mat = AssetDatabase.LoadAssetAtPath(matPath, typeof(Material)) as Material;
}
因此, PMA Shader
选项是否勾选, 影响的是在创建图集的时候, 是否使用Unlit/Premultiplied Colored
这个shader, 那么它有什么用呢?
NGUI官网上有人对这个提出疑问, 有人回答说这是在旧的机型上采用的特殊的alpha通道处理模式.
处理方式即使名字所说的—-预乘
预乘和非预乘的原理是什么
所谓 premultiply
和non- premultiply
就是 shader 在处理透明渲染的时候,是否从贴图里拾取 alpha 通道,把它乘在 rgb 通道上,在透明的同时作颜色上的衰减。
关于透明通道预乘, 可能会出现的问题和解决方法:
显示或存储带透明度的图片出现的「黑边」的问题 - GPU 时代的 C-style 字符串
渲染调色的运算有一条黑边出现 - 后期合成中unpremultiply与premultiply在什么时候用合适? - 又木君的回答 - 知乎
在特校透明贴图里, 透明出现黑边 / 白边, 衰减不够准确等问题 - 透明通道中预乘和非预乘的原理 (premultiply 和 non premultiply) | Evil 3D 引擎