2016-05-18 85 views
1

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

从多重采样扩展参考: “...的每个像素片段从而由整数X和Y网格坐标,颜色,SAMPLES_ARB深度值,纹理坐标,并与最大SAMPLES_ARB比特的覆盖值”。

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

回答

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值的数组。

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

+0

谢谢Nicol,这是一个非常明确和可以理解的解释!作为一个相关的问题,是否可以轻松地(无需迭代)检查多重采样纹理中的纹理样本是否全部相同? – user1282931

+0

@ user1282931:Nope;)虽然它会很好,但他们只是不存储这些信息。 –