Math 体渲染:与前后合成混淆

Math 体渲染:与前后合成混淆,math,graphics,rendering,volume,composite,Math,Graphics,Rendering,Volume,Composite,例如,在中,(颜色)是 C'i=(1-A'i-1)Ci+C'i-1 其中C'i是输出累积颜色值;A'i-1是上一个体素的累积alpha(不透明度)值;Ci是当前体素的颜色值;C'i-1是上一个体素的累积颜色值 这一提法给我提出了两个问题: 一旦累积不透明度达到约1,则前后终止。那么,对于在达到不透明度限制之前超过最大值的颜色通道(RGB),该怎么办?您是将值钳制在0到255之间(例如50010002000将变为255255255),还是查看通道之间的比率(例如50010002000将变为6412

例如,在中,(颜色)是

C'i=(1-A'i-1)Ci+C'i-1

其中C'i是输出累积颜色值;A'i-1是上一个体素的累积alpha(不透明度)值;Ci是当前体素的颜色值;C'i-1是上一个体素的累积颜色值

这一提法给我提出了两个问题:

  • 一旦累积不透明度达到约1,则前后终止。那么,对于在达到不透明度限制之前超过最大值的颜色通道(RGB),该怎么办?您是将值钳制在0到255之间(例如50010002000将变为255255255),还是查看通道之间的比率(例如50010002000将变为64128255)

  • 上一个问题的答案可能与此有关。当前体素的颜色输出取决于1减去累积不透明度。如果累计不透明度为零,而当前体素的不透明度为零,该怎么办输出是一个完全不透明的体素,因为(1-a'i-1)=1,即使它被认为是一个透明体素


  • 非常感谢任何提示。

    A和C应介于0和1之间。使用预乘的alpha;您将不会有溢出问题。

    Hm,让我们相信C和A介于0和1之间。正如我们可以看到的,顺序
    C'(i)=[1-A'(i+1)]C(i)+C'(i-1)
    随着
    i的增长而增长。我认为C不是颜色(RGB或任何型号)。也许是某些体素的“灰色”。也就是说,如果体素前面有许多体素,那么它应该比顶部体素更灰

    所以我的假设是,C_i并没有直接描述颜色。它告诉我们一些体素的颜色应该是灰色的

    请原谅我的英语不好,如果有什么不清楚的地方,请随时再问

    顺便说一句:如果你相信我,C_0(顶部体素的灰度)应该是1,A_0应该是0

  • A和C应在0-1范围内。(如果您使用无符号字节作为表示,请除以255.0,但请注意,对于某些体积渲染应用程序区域,这将使您无法充分控制较小的alpha/低不透明度区域,从而无法真正令人满意。如今,从一开始就使用浮点数进行计算通常比较容易)。事实证明,使用公式,alpha和color值永远无法超出此范围

  • 射线αA'的序列是A'(i)=(1-A'(i-1)).A(i)+A'(i-1)(其中A(i)是体素α),因此如果累积射线以“零”开始,并通过透明(零A)体素,则射线现在具有A'=(1-0)*0+0,这仍然是预期的零


  • 公式是递归的,你如何得到A''u 0和C''u 0?@Eugeny89:好问题!我不知道,也找不到参考来告诉我!我假设两种颜色都为0(即透明黑色)。了解颜色是否(或应该)与alpha进行预乘可能很重要。如果预先乘以,则在不透明度达到最大值之前,它们不应达到最大值。@Adrian:啊,这很有趣。如果乘以当前体素的不透明度,以及减去累积的不透明度,我确实发现事情开始变得有意义了。但是,我发现的所有文档都不是这样做的,是的,通常从A(0)=0和C(0)=0开始。我知道另一个参考文献给出的方程是C'(I)=(1-A'(I-1))*C(I)*A(I)+C'(I-1),这将是非预乘阿尔法版本。我发现非预乘的版本更直观;它的意思是只有当有物质存在时,体素颜色才会流入射线中。谢谢你的回答,似乎大部分情况下都很清楚。但在第(2)点:从你的答案来看,你似乎在计算当前体素的颜色贡献时先累积alpha,然后使用A'(i)而不是A'(i-1)?呃,对不起。。。我不明白你的意思。对于上面“2”中的表达式,我会使用say C'(I)=(1-A'(I-1))*C(I)*A(I)+C'(I-1)(参见对你问题的评论),所以我不知道A'(I)是从哪里来的?带素数的量是光线积分,未带素数的A&C是体积数据集中的体素值。啊,我想我误解了你的答案(把A读作C)。那么,我的原始问题中的公式只有在假设预乘alpha的情况下才有效,对吗?我敢肯定GPU Gems中没有提到这一点,这是很苛刻的。我敢肯定你可以将RGB的每个颜色通道分开处理,就像一次处理多个灰度级,然后组合成最终颜色…?你所说的预乘alpha到底是什么意思?你的意思是在继续构图之前将所有体素与其各自的alpha值相乘吗?这相当于timday的评论,将方程式表述为:C’(i)=(1-A’(i-1))*C(i)*A(i)+C’(i-1)。是的,基本上是这样。从传统的4通道颜色格式(C)到预乘alpha(C'):
    C''rgb=C''rgb*C''a
    C''a=C''a