OpenGL:覆盖渐变

时间:2020-01-30 23:21:06

标签: opengl shader alpha

如果使用alpha-to-coverage而不显式设置着色器中的样本(硬件4.x功能?),则alpha值'a'的coverage掩码是否保证为coverage掩码的位翻转为Alpha值“ 1.fa”?

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

我问的原因是我想对两个对象进行淡入淡出,并且在淡入淡出过程中,每个对象仍应相对于其本身进行适当的深度排序(不与其他对象的深度值进行交互,而不会成为“透视” ')。

如果没有,如何在一次渲染过程中实现这种“完美的”交叉淡入淡出?

1 个答案:

答案 0 :(得分:2)

用于Alpha覆盖率计算的逻辑必须具有与GL_SAMPLE_COVERAGE相同的不变性和比例保证(这允许您指定应用于给定渲染命令中所有片段的浮点覆盖率值)

但是,上述保证并不完全明确:

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

请注意使用“预期”一词,而不是“必需”一词。规范在所有这些方面都是特有的。

即使不变性真的很模糊:

在不同的像素位置,算法可能并且可能应该有所不同。如果确实存在差异,则应相对于窗口而不是屏幕坐标进行定义,以使渲染结果相对于窗口位置不变。

再次,注意单词“应该”。这里没有实际要求。

因此,基本上,所有问题的答案都是“ OpenGL规范对此不提供任何保证”。


话虽这么说,您的问题的总体主旨表明您正在尝试(ab)使用多重采样在两个重叠的事物之间进行交叉渐变,而无需执行渲染到纹理的操作。即使标准实际上保证了从alpha到覆盖的行为,这也不能很好地发挥作用。

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

进行16倍多重采样的成本将大大大于进行渲染到纹理的交叉渐变的成本。无论是在渲染时间还是在内存开销方面(16x多样本缓冲区都是巨大的)。


如果没有,如何在一次渲染过程中实现这种“完美的”交叉淡入淡出?

您不能;不在一般情况下。栅格化器累积值,新像素对所有先前值的累积值进行数学运算。您想让一个运算针对一个特定的先前运算进行数学运算,然后将这些结果结合起来并与其余的先前运算进行融合。

这根本不是光栅化器进行的数学运算。