关于 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 到底需不需要勾的最终结论的主要内容,如果未能解决你的问题,请参考以下文章

具有 haskell GLUT 绑定的透明度/Alpha

在 C# 中使用本机 HBitmap,同时保留 Alpha 通道/透明度

Transparency (or Translucency) Rendering

Transparency Tutorial with C# - Part 3

Python PIL 0.5 不透明度、透明度、阿尔法

证书透明度Certificate Transparency