6

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

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

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

谁能建议我一个正确的混合配方,不仅适用于 R、G 和 B,而且适用于 A 成分?

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

4

2 回答 2

10

Alpha 混合是比您想象的更深入的主题之一。这取决于 alpha 值在您的系统中的含义,如果您猜错了,那么您最终会得到看起来不错的结果,但会显示奇怪的伪影。

查看 Porter 和 Duff 的经典论文“合成数字图像”,了解精彩、易读的讨论和所有公式。您可能需要“over”运算符。

听起来您正在做一些更接近体积渲染的事情。有关公式和参考,请参阅图形常见问题解答,问题 5.16“如何执行体绘制?”。

于 2008-09-30T18:03:46.830 回答
2

有多种可能的方法来执行此操作,具体取决于 RGBA 值如何实际表示材料的属性。

这是一个可能的算法。从最终的像素颜色开始lightr=lightg=lightb=0lightleft=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% 的光。

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

于 2008-09-30T17:30:48.890 回答