【问题标题】:Can linear filtering be used for an FBO blit of an MSAA texture to non-MSAA texture?线性过滤可以用于 MSAA 纹理到非 MSAA 纹理的 FBO blit 吗?
【发布时间】:2015-08-23 14:34:02
【问题描述】:

我有两个 2D 纹理。第一个是 MSAA 纹理,使用目标 GL_TEXTURE_2D_MULTISAMPLE。第二个,非 MSAA 纹理,使用GL_TEXTURE_2D 的目标。

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

在这种情况下,这两个纹理都通过它们各自的 Framebuffer 对象附加到GL_COLOR_ATTACHMENT0。它们的分辨率也相同(据我所知,在将 MSAA 传送到非 MSAA 时,这是必要的)。

所以,鉴于当前的限制,如果我将持有 FBO 的 MSAA Blit 到持有 FBO 的非 MSAA,我是否仍然需要使用 GL_NEAREST 作为过滤选项,或者 GL_LINEAR 有效,因为这两个纹理都有已经渲染到了?

【问题讨论】:

    标签: opengl textures framebuffer blit msaa


    【解决方案1】:

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

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

    我实际上在规范中找不到任何内容说将过滤器设置为GL_LINEAR 用于多重采样纹理是一个错误。但过滤器根本没有使用。来自 OpenGL 4.5 规范(已添加重点):

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

    对于使用glBlitFramebuffer() 在多重采样和非多重采样纹理之间进行位图传输,filter 参数可以是 GL_LINEARGL_NEAREST,但在这种情况下会被忽略。来自 4.5 规范:

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

    这是有道理的,因为在这种情况下存在一个限制,即源矩形和目标矩形需要具有相同的大小:

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

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

    【讨论】:

    • 我认为,由于您可以对多重采样纹理进行采样的唯一方法是使用texelFetch (...),因此或多或少暗示大多数采样器状态是无意义的(例如,环绕模式、过滤器、LOD 偏差)。就像你说的,按照规范,这不是一个错误。设置这些状态,但如果您必须使用过滤器来描述行为,那么点/最近将是唯一的候选者。
    • @AndonM.Coleman 是的,我认为这正是第一个规范引用所描述的内容,我在其中强调了“不执行过滤”。
    • 是的,我只是想指出您可以设置这些采样器状态,它们只是不做任何事情:p 采样器对象将这些状态与纹理对象状态分开,并且可能会提出这个问题一个非问题。但是由于 GL 的传统设计,多重采样纹理对象具有与之关联的采样器状态,它们不做任何事情(因为它们没有被采样)。
    猜你喜欢
    • 2013-04-30
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多