sampler2D纹素的GLSL访问覆盖掩码

时间:2016-05-18 21:59:24

标签: opengl glsl textures antialiasing multisampling

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

从多重样本扩展引用: " ...每个像素片段由整数x和y网格坐标,颜色,SAMPLES_ARB深度值,纹理坐标和最大SAMPLES_ARB位的覆盖值组成。"

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

1 个答案:

答案 0 :(得分:3)

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

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

样本蒙版只是渲染的一部分。

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

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值。

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