如果使用alpha-to-coverage而不显式设置着色器中的样本(硬件4.x功能?),则alpha值'a'的coverage掩码是否保证为coverage掩码的位翻转为Alpha值“ 1.fa”?
或者换句话说:如果我在同一位置渲染两个对象,并且两个对象的像素alpha总计为1.0,那么是否可以保证像素的所有样本都被写入(假设两个对象都完全覆盖了)像素)?
我问的原因是我想对两个对象进行淡入淡出,并且在淡入淡出过程中,每个对象仍应相对于其本身进行适当的深度排序(不与其他对象的深度值进行交互,而不会成为“透视” ')。
如果没有,如何在一次渲染过程中实现这种“完美的”交叉淡入淡出?
答案 0 :(得分:2)
用于Alpha覆盖率计算的逻辑必须具有与GL_SAMPLE_COVERAGE
相同的不变性和比例保证(这允许您指定应用于给定渲染命令中所有片段的浮点覆盖率值)
但是,上述保证并不完全明确:
该值中的1的数量与样本覆盖率值成正比,所有1对应于1.0,所有0对应于0.0。
请注意使用“预期”一词,而不是“必需”一词。规范在所有这些方面都是特有的。
即使不变性真的很模糊:
在不同的像素位置,算法可能并且可能应该有所不同。如果确实存在差异,则应相对于窗口而不是屏幕坐标进行定义,以使渲染结果相对于窗口位置不变。
再次,注意单词“应该”。这里没有实际要求。
因此,基本上,所有问题的答案都是“ OpenGL规范对此不提供任何保证”。
话虽这么说,您的问题的总体主旨表明您正在尝试(ab)使用多重采样在两个重叠的事物之间进行交叉渐变,而无需执行渲染到纹理的操作。即使标准实际上保证了从alpha到覆盖的行为,这也不能很好地发挥作用。
基本上,您要尝试的是基于多样本的基于抖动的透明度。但是,与标准抖动方法一样,质量完全取决于样本数量。一个16倍的多重采样缓冲区(这是巨大的多重采样量)只会为您提供有效的16级淡入淡出效果。这将使任何一种动画淡入淡出效果都根本不平滑。
进行16倍多重采样的成本将大大大于进行渲染到纹理的交叉渐变的成本。无论是在渲染时间还是在内存开销方面(16x多样本缓冲区都是巨大的)。
如果没有,如何在一次渲染过程中实现这种“完美的”交叉淡入淡出?
您不能;不在一般情况下。栅格化器累积值,新像素对所有先前值的累积值进行数学运算。您想让一个运算针对一个特定的先前运算进行数学运算,然后将这些结果结合起来并与其余的先前运算进行融合。
这根本不是光栅化器进行的数学运算。