线性过滤可以用于MSAA纹理的FBO blit到非MSAA纹理吗?

时间:2015-06-08 23:42:26

标签: opengl textures framebuffer blit msaa

我有两个2D纹理。第一个是MSAA纹理,使用GL_TEXTURE_2D_MULTISAMPLE的目标。第二个非MSAA纹理使用GL_TEXTURE_2D的目标。

根据OpenGL的spec on ARB_texture_multisample,在绘制MSAA纹理时,只有GL_NEAREST是有效的过滤选项。

在这种情况下,这两个纹理都通过各自的Framebuffer对象附加到GL_COLOR_ATTACHMENT0。他们的分辨率也是相同的(根据我的知识,这对于将MSAA传播给非MSAA是必要的。)

因此,考虑到当前的限制,如果我将持有FBO的MSAA保持到持有FBO的非MSAA,我仍然需要使用GL_NEAREST作为过滤选项,或者GL_LINEAR是否有效,因为两个纹理都已渲染到?

1 个答案:

答案 0 :(得分:5)

过滤选项仅在纹理中采样时才会发挥作用。当你渲染纹理时,它们不起作用。

从多重采样纹理采样时,GL_NEAREST确实是唯一受支持的滤波器选项。您还需要在GLSL代码中使用特殊的采样器类型(sampler2DMS),并附带相应的采样说明。

我实际上无法在规范中找到任何内容,说明为多重采样纹理设置过滤器为GL_LINEAR是一个错误。但是根本没有使用过滤器。从OpenGL 4.5规范(强调添加):

  

当在着色器中访问多重采样纹理时,访问将获取一个整数向量,用于描述要获取的纹素以及与第14.3.1节中描述的样本数对应的整数,以确定要提取的纹理元素中的哪个样本。多重采样纹理目标上不允许使用标准采样指令,并且提取不执行过滤

对于使用glBlitFramebuffer()的多重采样和非多重采样纹理之间的blitting,过滤器参数可以是GL_LINEARGL_NEAREST,但在此忽略案件。从4.5规范:

  

如果读取帧缓冲区是多重采样的(其有效值SAMPLE_BUFFERS为1)且绘制帧缓冲区不是(其SAMPLE_BUFFERS的值为零),则对应于源中每个像素位置的样本将转换为单个样本写到目的地。 过滤器被忽略

这是有道理的,因为在这种情况下有一个限制,源和目标矩形需要是相同的大小:

  

如果读取或绘制帧缓冲区被多重采样,并且提供给BlitFramebufferare的源矩形和目标矩形的尺寸不相同,则会生成INVALID_OPERATION错误。

由于过滤器仅在图像被拉伸时应用,因此在这种情况下无关紧要。