线性过滤可用于将MSAA纹理复制到非MSAA纹理的FBO blit吗?

4
我有两个2D纹理。第一个是MSAA纹理,使用GL_TEXTURE_2D_MULTISAMPLE目标。第二个非MSAA纹理,使用GL_TEXTURE_2D目标。
根据OpenGL的ARB_texture_multisample规范,当绘制MSAA纹理时,只有GL_NEAREST是有效的过滤选项。
在这种情况下,这两个纹理都通过它们各自的帧缓冲对象附加到GL_COLOR_ATTACHMENT0。它们的分辨率也相同(据我所知,这是将MSAA复制到非MSAA时必须的)。
因此,在当前约束条件下,如果我将持有MSAA的FBO复制到不持有MSAA的FBO,则仍需要使用GL_NEAREST作为过滤选项,还是GL_LINEAR有效,因为这两个纹理已经被渲染了?
1个回答

6
过滤选项仅在从纹理中提取样本时起作用。在渲染到纹理时,它们不起任何作用。
从多重采样纹理中提取样本时,确实只支持GL_NEAREST过滤器选项。您还需要在GLSL代码中使用特殊的采样器类型(sampler2DMS),并使用相应的采样指令。
实际上,我无法在规范中找到任何关于将多重采样纹理的过滤器设置为GL_LINEAR是错误的内容。但是根本没有使用该过滤器。来自OpenGL 4.5规范(已加粗):
当在着色器中访问多重采样纹理时,访问会采用一个整数向量描述要获取的纹素以及一个整数对应于第14.3.1节中描述的采样编号,以确定要在纹素内获取哪个采样。在多重采样纹理目标上不允许使用标准采样指令,并且获取时不执行任何过滤。
对于使用glBlitFramebuffer()在多重采样和非多重采样纹理之间进行复制的情况,filter参数可以是GL_LINEAR或GL_NEAREST,但在这种情况下它被忽略。来自4.5规范:
如果读取帧缓冲区具有多重采样(其SAMPLE_BUFFERS的有效值为1),而绘制帧缓冲区没有(其SAMPLE_BUFFERS的值为零),则将与源中每个像素位置对应的采样转换为单个采样,然后再写入目标。filter被忽略。
这是有道理的,因为在这种情况下有一个限制,即源和目标矩形需要具有相同的大小:
如果提供给BlitFramebuffer的源和目标矩形的尺寸不相同,则会生成INVALID_OPERATION错误。
由于仅在拉伸图像时应用过滤器,因此在这种情况下它并不重要。

我认为,由于采样多重采样纹理的唯一方法是使用 texelFetch(...),因此大多数采样器状态是无意义的(例如环绕模式、过滤器、LOD 偏差)已经被暗示。正如你所说,根据规范设置这些状态不是错误。但是,如果必须使用过滤器来描述行为,则点采样 / 最近邻采样是唯一的选择。 - Andon M. Coleman
1
@AndonM.Coleman 是的,我认为这正是第一个规格引用所描述的内容,我在其中突出了“不执行过滤”的部分。 - Reto Koradi
是的,我只是想指出你可以设置那些采样器状态,但它们实际上并没有起到任何作用 :p 采样器对象将这些状态与纹理对象状态分开,可能会使这个问题不成问题。但由于GL的传统设计,多重采样纹理对象具有与其关联的采样器状态,但这些状态实际上并没有起到任何作用(因为它们没有被采样)。 - Andon M. Coleman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接