什么是glSampleMask?

时间:2013-10-23 00:57:09

标签: opengl shader

OpenGL wiki,其中glSampleMask()设置样本掩码的子字的值。 (这对我没有任何意义。)

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

掩码编号(本例中为0)表示什么?

gl_SamplerMask是shader等效于glSampleMask吗?

有人可以解释这里的条款吗?

1 个答案:

答案 0 :(得分:7)

由于答案晦涩难懂,现在几乎完全重写了。

规格说:

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强度)。 / p>

如何在实践中使用它?例如。你可以将一个绘图写入一个样本,一个绘制到另一个样本等,然后在着色器中读取它们并以您喜欢的方式组合。例如

// ... 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数组允许您执行相同的操作,但是基于每个片段,因此相同对象的不同片段可以使用不同的样本掩码 - 并作为结果写入不同的样本。