关于 Alpha is Transparency 到底需不需要勾的最终结论
Posted 勥小透明
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于 Alpha is Transparency 到底需不需要勾的最终结论相关的知识,希望对你有一定的参考价值。
结论当然是需要勾的!
原因要从透明混合模式说起,我们知道 unity shader 里有2种透明混合模式
Blend SrcAlpha OneMinusSrcAlpha // 传统透明度
Blend One OneMinusSrcAlpha // 预乘透明度
传统透明模式颜色混合正确是有前提的,就是做混合的目标,它是不透明的,也就是alpha=1。不透明物体的有效颜色即其颜色本身。
如果有那种半透明的情况,就是 alpha 在 0~1 之间,其实结果可能是不正确的,最直接表现就是,在混合结果中,在透明和不透明区域的边缘,会产生黑边。
对于这种问题,其实预乘透明度模式其实是可以解决的,因为它具有更好的纹理过滤特性。
但是它也不是没有缺陷的,在实践中,我们的纹理的数据源大多是 RGBA32,即单通道 8 比特,只能表示 0-255 的整数,同时游戏资产还会根据目标平台做纹理压缩。
由于精度问题,原本相近的颜色在预乘后会存储为更相近,甚至相同的颜色,经压缩后很容易产生大量 artifacts。要使用预乘 alpha 的纹理,一般会建议采用单通道 16 位的存储。
由于这种情况,即使预乘有很好的纹理过滤特性,也没有被广泛采用。
理论推导可以看这篇文章,写的很清楚了:关于理解 Premultiplied Alpha 的一些 Tips - 知乎
现在,就又说回来 Alpha is Transparency 的意义了,具体可以看官方文档:Texture Import Settings - Unity 手册
勾上以后,引擎会把边界处透明的颜色设置成和临近的不透明区域相近的值,这样边缘的不透明像素在Texture Filtering或计算mipmap时,就不会和黑色混合了(透明=黑色),从而避免产生黑边。
因此,但凡用alpha来表示透明的纹理,都应该把这个勾上。这样才能确保我们在用传统透明模式混合时的正确性。
以上是关于关于 Alpha is Transparency 到底需不需要勾的最终结论的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中使用本机 HBitmap,同时保留 Alpha 通道/透明度
Transparency (or Translucency) Rendering