OpenGL:覆盖率淡入淡出

问题描述 投票:1回答:1

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

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

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

如果没有,如何在单个渲染过程中实现如此完美的交叉淡入淡出?

opengl shader alpha
1个回答
0
投票

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

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

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

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

甚至不变性真的很模糊:

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

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

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


话虽这么说,您的问题总的意图是,您试图(多重)使用多重采样在两个重叠的事物之间进行交叉渐变,而不必执行渲染到纹理的操作。即使标准实际上保证了从alpha到覆盖的行为,这也不能很好地起作用。

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

cost

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

© www.soinside.com 2019 - 2024. All rights reserved.