关于颜色预乘(premultiply)

引言

在许多纹理打包器中都有一个颜色预乘选项,但是我在第一次使用的时候,并没有特别理解这个句话的意思,理解上只是混合算法不同,并不理解引入这个的目的如何。

从理解上来说,将本来分离的RGBA四个因子重新预乘起来,是一个很奇怪的事情,特别是在早期,我一直觉得不预乘扩展性应该还好点,反正我可以在运行时再乘,也不是很在乎多一个乘法的效率问题。

为什么要引入预乘

这个就是我在本次阅读中学习到的点,我从这个文章中得到的启示,这个是spine论坛中的一篇文章,从目的到混合算法都说得很明确,我这里简单说明下。

传统的后乘alpha算法在shader或者混合配置中应该是这样的。

blend(source, dest) = (source.rgb * source.a) + (dest.rgb * (1 – source.a))

而预乘算法是这样的

blend(source, dest) = source.rgb + (dest.rgb * (1 – source.a))

从感受上来说,只是程序员为了效率引入的东西,而实际上他还解决了以下几个问题。 ·解决纹理比例缩放映射产生的颜色错误问题 ·可以和其他纹理一起正常混合而不打破批次渲染

本文最重要的目的是讲解第一点,为什么会出现颜色的错误问题。当一个图片素材被引擎放置在屏幕上时,往往不是1:1映射的,有可能因为在世界坐标的不同位置,映射到屏幕可能有不同的缩放比例。

比如有linear,nearest等算法可以将缺失的像素补全。这时候这些缺失像素的计算,会因为alpha因子的本身也会被平均而导致RGB因子被缩放两次,进而会产生一个黑色的边缘。

而实际上我们希望的结果应该是alpha因子RGB值只被平均一次,进而有需求就是将RGB值在素材中就被预乘。

updatedupdated2021-01-192021-01-19