关于 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 手册

关于 Alpha is Transparency 到底需不需要勾的最终结论_第1张图片

勾上以后,引擎会把边界处透明的颜色设置成和临近的不透明区域相近的值,这样边缘的不透明像素在Texture Filtering或计算mipmap时,就不会和黑色混合了(透明=黑色),从而避免产生黑边。

因此,但凡用alpha来表示透明的纹理,都应该把这个勾上。这样才能确保我们在用传统透明模式混合时的正确性。

你可能感兴趣的:(Unity,unity,Alpha,Transparency,预乘透明度,Premultiplied)