我有许多RGBA像素,每个像素都有一个alpha分量。
所以我有一个像素列表:( p0 p1 p2 p3 p4 ... pn )其中p_0_是前像素,p_n_是最远的(在后面)。
最后一个(或任何)像素不一定是不透明的,因此得到的混合像素也可能以某种方式透明。 我从列表的开头到结尾混合,反之亦然(是的,它是光线追踪)。因此,如果任何时刻的结果变得不透明,我可以用足够正确的结果停止。 我将以这种方式应用混合算法:((( p0 @ p1 )@ p2 )@ p3 )...)
任何人都可以建议我正确的混合配方不仅适用于R,G和B,还适用于A成分吗?
UPD :我想知道如果确定混合颜色的过程我们可以有很多公式吗?它是某种近似吗?对我来说,这看起来很疯狂:公式并没有那么不同,我们真正获得了效率或优化。任何人都可以澄清这个吗?
答案 0 :(得分:10)
Alpha混合是其中一个比您想象的更深入的主题。这取决于alpha值在你的系统中意味着什么,如果你猜错了,那么你最终会得到看起来很好的结果,但这会显示出奇怪的文物。
查看Porter和Duff的经典论文“Compositing Digital Images”,以获得精彩,可读的讨论和所有公式。你可能想要“over”运算符。
听起来你正在做更接近体积渲染的事情。有关公式和参考,请参阅Graphics FAQ,问题5.16“如何执行体绘制?”。
答案 1 :(得分: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之间归一化,我假设a = 1表示不透明,a = 0表示完全透明)
如果遇到的第一个像素为蓝色且不透明度为50%,则可用颜色的50%设置为蓝色,其余未知。如果接下来是不透明度为50%的红色像素,那么剩余光的25%将设置为红色,因此像素具有50%蓝色,25%红色。如果接下来是不透明度为60%的绿色像素,则像素为50%蓝色,25%红色,15%绿色,剩余10%的光。
与此功能相对应的物理材料是发光但部分不透明的材料:因此,堆叠中间的像素永远不会使最终颜色变暗:它只能阻止其后面的光线增加最终颜色(是黑色和完全不透明的。)