我有两个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
是否有效,因为两个纹理都已渲染到?
答案 0 :(得分:5)
过滤选项仅在从纹理中采样时才会发挥作用。当你渲染纹理时,它们不起作用。
从多重采样纹理采样时,GL_NEAREST
确实是唯一受支持的滤波器选项。您还需要在GLSL代码中使用特殊的采样器类型(sampler2DMS
),并附带相应的采样说明。
我实际上无法在规范中找到任何内容,说明为多重采样纹理设置过滤器为GL_LINEAR
是一个错误。但是根本没有使用过滤器。从OpenGL 4.5规范(强调添加):
当在着色器中访问多重采样纹理时,访问将获取一个整数向量,用于描述要获取的纹素以及与第14.3.1节中描述的样本数对应的整数,以确定要提取的纹理元素中的哪个样本。多重采样纹理目标上不允许使用标准采样指令,并且提取不执行过滤。
对于使用glBlitFramebuffer()
的多重采样和非多重采样纹理之间的blitting,过滤器参数可以是GL_LINEAR
或GL_NEAREST
,但在此忽略案件。从4.5规范:
如果读取帧缓冲区是多重采样的(其有效值SAMPLE_BUFFERS为1)且绘制帧缓冲区不是(其SAMPLE_BUFFERS的值为零),则对应于源中每个像素位置的样本将转换为单个样本写到目的地。 过滤器被忽略。
这是有道理的,因为在这种情况下有一个限制,源和目标矩形需要是相同的大小:
如果读取或绘制帧缓冲区被多重采样,并且提供给BlitFramebufferare的源矩形和目标矩形的尺寸不相同,则会生成INVALID_OPERATION错误。
由于过滤器仅在图像被拉伸时应用,因此在这种情况下无关紧要。