多少像素进行Alpha混合的公式是什么?

时间:2020-03-06 14:56:08  来源:igfitidea点击:

我有许多RGBA像素,每个像素都有一个alpha分量。

所以我有一个像素列表:(p0 p1 p2 p3 p4 ... pn)其中p_0_是最前面的像素,p_n_是最远的(在背面)。

最后一个(或者任何一个)像素不一定是不透明的,因此生成的混合像素也可以是透明的。
我正在从列表的开头到结尾进行混合,反之亦然(是的,它是光线追踪)。因此,如果结果在任何时候变得不透明,我都可以以足够正确的结果停止。
我将以这种方式应用混合算法:(((((p0 @ p1)@ p2)@ p3)...)

谁能为我建议一个正确的混合配方,不仅适用于R,G和B,还适用于A组分?

UPD:我想知道,对于确定的混合颜色过程,我们可能有很多公式吗?是某种近似吗?对我来说,这看起来很疯狂:公式并没有太大的不同,以至于我们真正获得了效率或者优化。谁能澄清一下?

解决方案

取决于RGBA值实际代表材料属性的方式,有多种可能的方法。

这是一个可能的算法。从最终像素颜色" lightr = lightg = lightb = 0"," lightleft = 1"开始;

对于遇到的每个r,g,b,评估一个像素:

lightr += lightleft*r*(1-a)
lightg += lightleft*g*(1-a)
lightb += lightleft*b*(1-a)
lightleft *= 1-a;

(RGBA值在0和1之间归一化,我假设a = 1表示不透明,a = 0表示完全透明)

如果遇到的第一个像素是不透明度为50%的蓝色,则将50%的可用颜色设置为蓝色,其余颜色未知。如果下一个具有50%不透明度的红色像素,则将剩余光的25%设置为红色,因此该像素具有50%的蓝色,25%的红色。如果下一个不透明度为60%的绿色像素,则该像素为50%蓝色,25%红色,15%绿色,剩余10%的光。

与此功能相对应的物理材料是发光的但部分不透明的材料:因此,堆叠中间的像素永远不会使最终颜色变暗:它只能防止其背后的光增加最终颜色(通过变黑)且完全不透明)。

Alpha混合是比我们想象的更深入的主题之一。这取决于alpha值在系统中的含义,如果我们猜错了,那么最终会得到看起来还可以的结果,但显示出异常的结果。

查阅Porter and Duff的经典论文" Compositing Digital Images",获得了广泛而易读的讨论以及所有公式。我们可能需要" over"运算符。

听起来我们正在做一些接近体积渲染的事情。有关公式和参考,请参阅图形常见问题,问题5.16"如何执行体积渲染?"。