什么是glSampleMask?

6
OpenGL维基表示glSampleMask()设置样本掩码的子字的值,但这对我来说没有任何意义。那么什么是样本掩码?(我知道glColorMask,但无法将其与glSampleMask相对应)。我假设它与在计算最终颜色时选择哪些样本有关? 但是,如果我每个像素有4个样本,并设置了glSampleMask(0, 0xFF),会发生什么?
这种情况下,掩码编号(此处为0)代表什么?
gl_SamplerMask是glSampleMask的着色器等效物吗?
有人能解释一下这些术语吗?
1个回答

8
作为答案不清晰,现在几乎完全重写了。
规范说明:
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代表第一个和第二个采样值,以此类推。着色器只会被评估一次,而采样值会被插值/外插值,因此每个着色器执行将生成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超级圣经》第5版包含使用此技术进行无序(尽管相当有限)透明度的示例。
着色器中的gl_SampleMask数组允许您在每个片段上执行相同的操作,因此同一对象的不同片段可以使用不同的样本掩码,并作为结果写入不同的样本。

这现在对我来说很有道理。谢谢。唯一剩下的是 glSampleMaski API 调用中的 "maskNumber" 是什么。你在两个调用中都使用了 0。 - viktorzeid
maskNumber 用于指定要更改的位域。由于 GLbitfield 的大小限制为32位 - 如果您有一些极高的多重采样(不认为当前硬件能够实现),超过32个样本 - 要更改更高的位,您需要指定第二个位域。 - keltar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接