2015-06-08 33 views
3

我有两个2D纹理。第一个是MSAA纹理,使用GL_TEXTURE_2D_MULTISAMPLE的目标。第二个非MSAA纹理使用GL_TEXTURE_2D的目标。线性过滤可以用于MSAA纹理到非MSAA纹理的FBO blit?

根据OpenGL的spec on ARB_texture_multisample,当绘制MSAA纹理时,只有GL_NEAREST是有效的过滤选项。

在这种情况下,这两种纹理的通过它们的单独的帧缓冲器的对象附加到GL_COLOR_ATTACHMENT0。他们的决议也是相同的大小(据我所知,这是必要的,当一个MSAA非MSAA)。因此,考虑到目前的限制,如果我将MSAA持有的FBO闪烁到非MSAA持有的FBO,是否仍然需要使用GL_NEAREST作为过滤选项,或者是GL_LINEAR有效,因为两个纹理都已经呈现至?

回答

5

的过滤选项才开始发挥作用,当你从纹理样品。他们不起任何作用,而你渲染质感。

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

我居然找不到规范说,过滤器设置为GL_LINEAR的多重采样纹理是错误的东西。但是根本不使用过滤器。从OpenGL的4.5规范(强调):

当多重采样纹理在着色器访问时,访问需要说明抓取哪些纹理像素整数中的一个矢量和对应于在部分14.3中描述的样本数的整数.1确定纹素中的哪个样本要读取。没有标准的采样指令被允许在多重采样纹理的目标,和没有滤波由所述提取进行

对于glBlitFramebuffer()多重采样和非多重采样纹理之间的blitting,所述滤波器参数可以是GL_LINEARGL_NEAREST,但在这种情况下被忽略。从4.5规格:

如果读取帧缓冲器被多重采样(其SAMPLE_BUFFERS的有效值是其中之一)和拉伸帧缓冲器不是(其SAMPLE_BUFFERS的值为零),对应于每个像素位置处的所述样品源代码在写入目标之前会被转换为单个样本。 过滤器被忽略

这是有意义的,因为在这种情况下,源和目的矩形需要具有相同的尺寸的限制:

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

由于当图像被拉伸的过滤器仅施加,它不会在这种情况下重要。

+0

我认为,因为你可以采样多重采样纹理的唯一方法是使用'texelFetch(...)',这或多或少地暗示大多数采样器状态是无意义的(例如,换行模式,滤波器,LOD偏差)。就像你说的那样,根据规范,这不是一个错误。设置这些状态,但是如果您必须使用过滤器来描述行为,那么点/最近将是唯一的候选者。 –

+1

@ AndonM.Coleman是的,我认为这正是第一个规范引用描述的内容,其中我突出显示了“不执行过滤”。 –

+0

是的,我只是想指出你可以设置这些采样器状态,他们只是不做任何事情:p Sampler对象将这些状态从纹理对象状态中分离出来,并且很可能会使这个问题不成问题。但由于GL的传统设计,多重采样纹理对象具有与它们相关的采样器状态,因此它们不会执行任何操作(因为它们未被采样)。 –