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

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

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

任何人都可以建议我正确的混合配方不仅适用于R,G和B,还适用于A成分吗?

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

有帮助吗?

解决方案

Alpha混合是其中一个比您想象的更深入的主题。这取决于alpha值在你的系统中意味着什么,如果你猜错了,那么你最终会得到看起来很好的结果,但这会显示出奇怪的文物。

查看Porter和Duff的经典论文“合成数字图像” ;一个伟大的,可读的讨论和所有的公式。你可能想要“结束”操作

听起来你正在做更接近体积渲染的事情。有关公式和参考,请参阅图形常见问题解答,问题5.16“如何我是否进行体积渲染?“

其他提示

根据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%的光。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top