表示glSampleMask()
的OpenGL Wiki设置了示例蒙版的子词的值。 (这对我来说没有任何意义。)
那么样本掩蔽是什么意思呢? (我知道glColorMask,但是不能将其与glSampleMask关联起来)。我假设这与计算最终颜色时最终选择哪些样本有关?
但是,假设我每个像素有4个样本,并且设置了glSampleMask(0,0xFF),究竟会发生什么?
掩码编号(在这种情况下为0)表示什么?
gl_SamplerMask着色器是否与glSampleMask等效?
有人可以在这里解释这些条款吗?
最佳答案
由于答案晦涩难懂,现在几乎完全重写了。
规范说:
if SAMPLE_MASK is enabled, the fragment coverage is ANDed with the
coverage value SAMPLE_MASK_VALUE
看看http://msdn.microsoft.com/en-us/library/windows/desktop/cc627092%28v=vs.85%29.aspx#Multisample的图片
此图像上的点显示了示例位置。样本掩码允许您指定要写入样本的位域。如果您指定了0x1,将仅写入第一个样本,0x2-第二个,0x3-第一和第二个,依此类推。仅对Shader进行一次评估,并且对样本值进行内插/外插,因此对于每次执行Shader,您将拥有4、8、16等样本(取决于您启用的MSAA的强度)。
如何在实践中使用它?例如。您可以将一个绘图写到一个样本中,一次写到另一个样本中,依此类推,然后在着色器中全部读取它们并以您喜欢的方式进行组合。例如
// ... attach FBO
glEnable(GL_SAMPLE_MASK);
glSampleMaski(0, 0x1);
// ... draw scene0
glSampleMaski(0, 0x2);
// ... draw scene1
glDisable(GL_SAMPLE_MASK);
// ... bind FBO to texture
// ... bind tricky shader
// ... draw it, reading both results from different samples and combining them
您可以使用
texelFetch(texture, texcoords, i)
从FBO读取不同的样本,其中i
是样本数,从零开始。OpenGL super 圣经,第5版,包含有关使用此技术实现顺序无关(尽管非常有限)的透明度的示例。
着色器中的
gl_SampleMask
数组允许您执行相同的操作,但是基于每个片段,因此同一对象的不同片段可以使用不同的样本蒙版-并作为结果写入不同的样本中。关于opengl - 什么是glSampleMask?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19530924/