4

I have two 2D textures. The first, an MSAA texture, uses a target of GL_TEXTURE_2D_MULTISAMPLE. The second, non MSAA texture, uses a target of GL_TEXTURE_2D.

According to OpenGL's spec on ARB_texture_multisample, only GL_NEAREST is a valid filtering option when the MSAA texture is being drawn to.

In this case, both of these textures are attached to GL_COLOR_ATTACHMENT0 via their individual Framebuffer objects. Their resolutions are also the same size (to my knowledge this is necessary when blitting an MSAA to non-MSAA).

So, given the current constraints, if I blit the MSAA holding FBO to the non-MSAA holding FBO, do I still need to use GL_NEAREST as the filtering option, or is GL_LINEAR valid, since both textures have already been rendered to?

4

1 回答 1

6

只有当您从纹理中采样时,过滤选项才会发挥作用。当您渲染到纹理时,它们不起作用。

从多重采样纹理中采样时,GL_NEAREST确实是唯一支持的过滤器选项。您还需要sampler2DMS在 GLSL 代码中使用特殊的采样器类型 ( ) 以及相应的采样指令。

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

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

对于使用 的多样本和非多样本纹理之间的位图传输glBlitFramebuffer()过滤器参数可以是GL_LINEARGL_NEAREST,但在这种情况下会被忽略。从 4.5 规范:

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

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

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

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

于 2015-06-09T02:49:41.503 回答