线性滤波可以用于MSAA纹理到非MSAA纹理的FBO blit



我有两个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_LINEARGL_NEAREST,但在这种情况下它被忽略。来自4.5规范:

如果读帧缓冲区是多采样的(其SAMPLE_BUFFERS的有效值为1),而绘制帧缓冲区不是(其SAMPLE_BUFFERS的值为零),则源中每个像素位置对应的样本在写入目标之前被转换为单个样本。过滤器被忽略

这是有意义的,因为在这种情况下有一个限制,源矩形和目标矩形必须是相同的大小:

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

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

最新更新