线性过滤能否用于从 MSAA 纹理到非 MSAA 纹理的 FBO blit?
Can linear filtering be used for an FBO blit of an MSAA texture to non-MSAA texture?
我有两个 2D 纹理。第一个是 MSAA 纹理,使用 GL_TEXTURE_2D_MULTISAMPLE
的目标。第二个非 MSAA 纹理使用 GL_TEXTURE_2D
.
的目标
根据 OpenGL 的 spec on ARB_texture_multisample,只有 GL_NEAREST
是绘制 MSAA 纹理时的有效过滤选项。
在这种情况下,这两个纹理都通过它们各自的帧缓冲区对象附加到 GL_COLOR_ATTACHMENT0
。它们的分辨率大小也相同(据我所知,将 MSAA 转为非 MSAA 时,这是必要的)。
因此,鉴于当前的限制条件,如果我将持有 FBO 的 MSAA 位块化为持有 FBO 的非 MSAA,我是否仍需要使用 GL_NEAREST
作为过滤选项,或者是 GL_LINEAR
有效,因为两个纹理都已渲染到?
只有当您从 纹理中采样时,过滤选项才会发挥作用。当您 渲染到 纹理时,它们不起作用。
从多重采样纹理采样时,GL_NEAREST
确实是唯一受支持的过滤器选项。您还需要在 GLSL 代码中使用特殊的采样器类型(sampler2DMS
),以及相应的采样指令。
我实际上在规范中找不到任何内容表明将过滤器设置为 GL_LINEAR
用于多重采样纹理是错误的。但是根本没有使用过滤器。来自 OpenGL 4.5 规范(添加了重点):
When a multisample texture is accessed in a shader, the access takes one vector of integers describing which texel to fetch and an integer corresponding to the sample numbers described in section 14.3.1 determining which sample within the texel to fetch. No standard sampling instructions are allowed on the multisample texture targets, and no filtering is performed by the fetch.
对于 glBlitFramebuffer()
的多重采样和非多重采样纹理之间的 blitting,filter 参数可以是 GL_LINEAR
或 GL_NEAREST
,但是在这种情况下它被忽略。来自 4.5 规范:
If the read framebuffer is multisampled (its effective value of SAMPLE_BUFFERS is one) and the draw framebuffer is not (its value of SAMPLE_BUFFERS is zero), the samples corresponding to each pixel location in the source are converted to a single sample before being written to the destination. filter is ignored.
这是有道理的,因为在这种情况下有一个限制,即源矩形和目标矩形的大小必须相同:
An INVALID_OPERATION error is generated if either the read or draw framebuffer is multisampled, and the dimensions of the source and destination rectangles provided to BlitFramebufferare not identical.
由于滤镜仅在图像被拉伸时应用,因此在这种情况下无关紧要。
我有两个 2D 纹理。第一个是 MSAA 纹理,使用 GL_TEXTURE_2D_MULTISAMPLE
的目标。第二个非 MSAA 纹理使用 GL_TEXTURE_2D
.
根据 OpenGL 的 spec on ARB_texture_multisample,只有 GL_NEAREST
是绘制 MSAA 纹理时的有效过滤选项。
在这种情况下,这两个纹理都通过它们各自的帧缓冲区对象附加到 GL_COLOR_ATTACHMENT0
。它们的分辨率大小也相同(据我所知,将 MSAA 转为非 MSAA 时,这是必要的)。
因此,鉴于当前的限制条件,如果我将持有 FBO 的 MSAA 位块化为持有 FBO 的非 MSAA,我是否仍需要使用 GL_NEAREST
作为过滤选项,或者是 GL_LINEAR
有效,因为两个纹理都已渲染到?
只有当您从 纹理中采样时,过滤选项才会发挥作用。当您 渲染到 纹理时,它们不起作用。
从多重采样纹理采样时,GL_NEAREST
确实是唯一受支持的过滤器选项。您还需要在 GLSL 代码中使用特殊的采样器类型(sampler2DMS
),以及相应的采样指令。
我实际上在规范中找不到任何内容表明将过滤器设置为 GL_LINEAR
用于多重采样纹理是错误的。但是根本没有使用过滤器。来自 OpenGL 4.5 规范(添加了重点):
When a multisample texture is accessed in a shader, the access takes one vector of integers describing which texel to fetch and an integer corresponding to the sample numbers described in section 14.3.1 determining which sample within the texel to fetch. No standard sampling instructions are allowed on the multisample texture targets, and no filtering is performed by the fetch.
对于 glBlitFramebuffer()
的多重采样和非多重采样纹理之间的 blitting,filter 参数可以是 GL_LINEAR
或 GL_NEAREST
,但是在这种情况下它被忽略。来自 4.5 规范:
If the read framebuffer is multisampled (its effective value of SAMPLE_BUFFERS is one) and the draw framebuffer is not (its value of SAMPLE_BUFFERS is zero), the samples corresponding to each pixel location in the source are converted to a single sample before being written to the destination. filter is ignored.
这是有道理的,因为在这种情况下有一个限制,即源矩形和目标矩形的大小必须相同:
An INVALID_OPERATION error is generated if either the read or draw framebuffer is multisampled, and the dimensions of the source and destination rectangles provided to BlitFramebufferare not identical.
由于滤镜仅在图像被拉伸时应用,因此在这种情况下无关紧要。