6

glSampleMask()设置示例掩码的子词的值的 OpenGL wiki。(这对我来说没有任何意义。)

那么样本掩蔽是什么意思呢?(我知道 glColorMask,但不能将它与 glSampleMask 关联起来)。我假设它与计算最终颜色时最终选择的样本有关?但是假设我每个像素有 4 个样本并且我设置了 glSampleMask(0, 0xFF),到底会发生什么?

掩码号(在这种情况下为 0)表示什么?

gl_SamplerMask 是 glSampleMask 的着色器等价物吗?

有人可以在这里解释这些术语吗?

4

1 回答 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

您可以从 FBO 读取不同的样本texelFetch(texture, texcoords, i),其中i是样本数,从零开始。

OpenGL 超级圣经,第 5 版,包含使用这种技术实现与顺序无关(尽管非常有限)透明度的示例。

gl_SampleMask着色器中的数组允许您执行相同的操作,但基于每个片段,因此同一对象的不同片段可以使用不同的样本掩码 - 并作为结果写入不同的样本。

于 2013-10-23T05:30:17.297 回答