OpenGL:阿尔法到覆盖的交叉淡入淡出



如果使用alpha到覆盖率而不显式设置着色器中的样本(硬件4.x功能?(,那么alpha值"a"的覆盖掩码是否保证是alpha值"1.f-a"的覆盖掩码的位翻转?

或者换句话说:如果我在同一位置渲染两个对象,并且两个对象的像素 alpha 加起来为 1.0,那么是否可以保证像素的所有样本都被写入(假设两个对象都完全覆盖像素(?

我问的原因是我想交叉淡入淡出两个对象,在交叉淡入淡出期间,每个对象仍然应该相对于自身进行适当的深度排序(不与另一个对象的深度值交互,也不会变得"透视"(。

如果不是,我如何在单个渲染通道中实现如此"完美"的交叉淡入淡出?

alpha 到覆盖率计算的逻辑需要具有与GL_SAMPLE_COVERAGE相同的不变性和比例性保证(这允许您指定应用于给定呈现命令中所有片段的浮点覆盖率值(。

但是,上述保证并不完全具体:

此值中的 1 数应与样本覆盖率值成正比,所有 1 对应于值 1.0,所有 0 对应于 0.0。

请注意使用"打算"一词,而不是"必需"。该规范故意在所有这些方面都超级模糊。

甚至不变性也非常模糊:

该算法在不同的像素位置可以而且可能应该不同。如果确实不同,则应相对于窗口坐标而不是屏幕坐标定义它,以便呈现结果相对于窗口位置不变。

再次注意"应该"一词。这里没有实际要求。

所以基本上,你所有问题的答案都是"OpenGL规范没有提供任何保证"。


话虽如此,您问题的主旨表明您正在尝试(滥用(使用多重采样在两个重叠事物之间进行交叉淡入淡出,而无需执行渲染到纹理操作。这不会很好地工作,即使标准实际上保证了有关alpha覆盖行为的某些内容。

基本上,您要做的是基于多样本的基于抖动的透明度。但与标准抖动方法一样,质量完全取决于样品数量。16 倍多重采样缓冲区(这是大量的多重采样(只能为您提供有效的 16 级交叉淡入淡出。这将使任何类型的动画淡入淡出效果根本不平滑。

执行 16 倍多重采样的成本将远远高于进行渲染到纹理交叉淡入淡出的成本。在渲染时间和内存开销方面(16x 多重采样缓冲区是巨大的(。


如果不是,我如何在单个渲染通道中实现如此"完美"的交叉淡入淡出?

你不能;在一般情况下不行。光栅器累积值,新像素针对所有先前值的累积值进行数学运算。您希望让一个操作针对特定的先前操作执行数学运算,然后合并这些结果并混合前面的其余操作。

这根本不是光栅器所做的那种数学。

最新更新