我有两个2D纹理。第一种是MSAA纹理,使用GL_TEXTURE_2D_MULTISAMPLE
作为目标。第二个,非MSAA纹理,使用GL_TEXTURE_2D
的目标。
根据OpenGL关于ARB_texture_multisample的规范,当MSAA纹理被绘制到时,只有GL_NEAREST
是一个有效的过滤选项。
在这种情况下,这两个纹理都通过它们各自的Framebuffer对象附加到GL_COLOR_ATTACHMENT0
。它们的分辨率也是相同的大小(据我所知,在将MSAA比特化为非MSAA时,这是必要的)。
因此,鉴于当前的限制,如果我将持有FBO的MSAA blit到持有非MSAA的FBO,我是否仍然需要使用GL_NEAREST
作为过滤选项,或者GL_LINEAR
有效,因为这两种纹理都已经被渲染到?
过滤选项只有在从中采样纹理时才会起作用。当你渲染到纹理时,它们不起作用。
当从多样本纹理中采样时,GL_NEAREST
确实是唯一支持的过滤器选项。您还需要在GLSL代码中使用特殊的采样器类型(sampler2DMS
),并附带相应的采样指令。
我实际上在规范中找不到任何东西说将过滤器设置为GL_LINEAR
用于多样本纹理是一个错误。但是根本就没有使用过滤器。来自OpenGL 4.5规范(强调添加):
当在着色器中访问一个多样本纹理时,该访问使用一个整数向量来描述要获取的纹理,以及一个对应于14.3.1节中描述的样本数的整数来确定要获取的纹理中的哪个样本。在多样本纹理目标上不允许有标准的采样指令,并且在fetch中不执行过滤。
对于使用glBlitFramebuffer()
的多采样和非多采样纹理之间的位元化,filter参数可以是GL_LINEAR
或GL_NEAREST
,但在这种情况下它被忽略。来自4.5规范:
如果读帧缓冲区是多采样的(其SAMPLE_BUFFERS的有效值为1),而绘制帧缓冲区不是(其SAMPLE_BUFFERS的值为零),则源中每个像素位置对应的样本在写入目标之前被转换为单个样本。过滤器被忽略。
这是有意义的,因为在这种情况下有一个限制,源矩形和目标矩形必须是相同的大小:
如果读取或绘制帧缓冲区是多次采样的,并且提供给blitframebuffer源矩形和目标矩形的尺寸不相同,则会产生INVALID_OPERATION错误。
由于过滤器仅在图像拉伸时应用,因此在这种情况下无关紧要