由于答案晦涩难懂,现在几乎完全重写了。
规格 说:
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
着色器中的数组允许您执行相同的操作,但基于每个片段,因此同一对象的不同片段可以使用不同的样本掩码 - 并作为结果写入不同的样本。