一些像素的alpha混合公式是什么?

6
我有一些RGBA像素,每个像素都有一个alpha分量。
因此,我有一个像素列表:(p0 p1 p2 p3 p4 ... pn),其中p0是前面的像素,pn是最远的(在后面)。
最后一个(或任何)像素不必是不透明的,因此混合后的像素也可以是某种程度上透明的。 我从列表的开头向结尾混合,而不是反过来(是的,这是光线追踪)。因此,如果在任何时刻结果变得足够不透明,我可以停止并得到足够正确的结果。 我将以以下方式应用混合算法:((((p0 @ p1) @ p2) @ p3) ...)。
有人能为我建议一个正确的混合公式,不仅适用于R、G和B,还适用于A分量吗?
更新:我想知道,在确定混合颜色的过程中,我们如何可能有许多公式?这是某种近似吗?对我来说,这看起来很疯狂:公式并不那么不同,以至于我们真的获得效率或优化。有人能澄清一下吗?
2个回答

10
Alpha混合是一个比你想象中更深入的话题。它取决于在您的系统中alpha值的含义,如果猜错了,那么您将得到看起来还不错但显示奇怪伪影的结果。
请查看Porter和Duff的经典论文“数字图像合成”,其中有一个很好、易读的讨论和所有公式。您可能需要“over”运算符。
听起来您正在做更接近体积渲染的事情。有关公式和参考,请参见图形常见问题解答,第5.16个问题“如何执行体积渲染?”。

2

有多种可能的方法可以完成这个任务,具体取决于RGBA值实际上如何表示材料的属性。

以下是一种可能的算法。从最终像素颜色lightr = lightg = lightb = 0lightleft = 1开始;

遇到每个r,g,b,a像素时进行评估:

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%的光线。
对应于此函数的物理材料是发光但部分不透明的材料:因此,堆栈中间的像素永远不能使最终颜色变暗:它只能通过成为黑色且完全不透明来防止其后面的光增加最终颜色。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接