采样器 2D 纹素的 GLSL 访问覆盖掩码

GLSL access coverage mask of sampler2D texel

如果我通过 sampler2DMS 访问 GLSL 中的多重采样纹理,我如何知道该多重采样纹理的纹素中的哪些样本实际上已被覆盖?

来自多样本扩展参考: “...每个像素片段因此由整数 x 和 y 网格坐标、颜色、SAMPLES_ARB 深度值、纹理坐标和最大 SAMPLES_ARB 位的覆盖值组成。”

所以我想访问的是纹素的覆盖值。我可以使用 gl_SampleMask (https://www.opengl.org/sdk/docs/man/html/gl_SampleMask.xhtml) 来写入当前处理的 FRAGMENT 的覆盖值,但是如何访问我从多重采样纹理中获取的 TEXEL 的覆盖值?

多重采样的想法是,当您渲染到多重采样图像时,您只需为每个像素大小的区域执行一次片段着色器。光栅化器生成的覆盖掩码确定片段输出到像素内的哪些样本。

但是一旦该过程完成,一旦片段着色器写入其数据,多重采样图像本身就完全不知道这些覆盖遮罩是什么。多采样纹理只是每个纹素有多个采样值。它不知道哪些片段使用哪些样本掩码生成了哪些样本。

蒙版示例只是渲染的一部分。

这样想。这是多重采样纹理的像素:

vec4 pixel[SAMPLE_COUNT];

当您渲染到多重采样纹理时,您的片段着色器会执行与此等效的操作:

for(int sample_ix = 0; sample_ix < SAMPLE_COUNT; ++sample_ix)
{
  if(sampleMask[sample_ix])
    pixel[sample_ix] = output;
}

pixel的数据可能最初来自样本掩码。但是 pixel 不知道会发生这种情况;它只是一个 vec4 值的数组。

您可以获得当前片段的覆盖值。但这与最初用于组成多重采样纹理中的像素的实际覆盖值无关。