2008-09-30 21 views
6

我有一些RGBA像素,每个像素都有一个alpha分量。许多像素的alpha混合公式是什么?

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

最后(或任何)像素不是必需的不透明,所以最终的混合像素也可以以某种方式透明。 我从列表的开头混合到最后,而不是反过来(是的,它是光线跟踪)。所以如果结果在任何时候都变得不透明,我可以用足够正确的结果来阻止。 (@P2)(((P0 @P1)@P3)...)

任何人都可以建议我一个正确的混合式: 我会应用混合算法,以这种方式不仅对于R,G和B,而且对于A组件也是如此?

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

回答

10

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

查看Porter和Duff的经典论文“Compositing Digital Images”,获得一个伟大的,可读的讨论和所有的公式。你可能想要“over”操作符。

这听起来像你正在做一些更接近于体积渲染的东西。有关公式和参考文献,请参阅Graphics FAQ,问题5.16“如何执行体积渲染?”。

+0

伟大的联系,男人!非常感谢你! – avp 2008-10-01 08:09:56

2

根据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之间的归一化,并且我假设一个= 1表示不透明,α= 0意味着完全透明)

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

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