Opengl 在着色器中将帧缓冲区对象用作纹理

Opengl 在着色器中将帧缓冲区对象用作纹理,opengl,fbo,Opengl,Fbo,我可以使用FBO blitting将渲染FBO作为纹理传递到我的“解析着色器”输入吗 我可以使用FBO作为着色器“sampler2D”的输入吗 我是说,我向fbo提供了一些东西。现在我想对图像进行后期处理,我可以将FBO作为纹理传递给着色器吗?您不能“将FBO作为纹理传递” 取而代之的是使用纹理作为附件(尤其是颜色附件)创建FBO;然后可以使用此类纹理的内容正常绘制(到默认FBO目标,通常是屏幕) 对于典型的全屏后处理效果,通常会绘制一个全屏四边形,但当然,您的想象力非常有限(例如,您可以在电视

我可以使用FBO blitting将渲染FBO作为纹理传递到我的“解析着色器”输入吗

我可以使用FBO作为着色器“sampler2D”的输入吗

我是说,我向fbo提供了一些东西。现在我想对图像进行后期处理,我可以将FBO作为纹理传递给着色器吗?

您不能“将FBO作为纹理传递”

取而代之的是使用纹理作为附件(尤其是颜色附件)创建FBO;然后可以使用此类纹理的内容正常绘制(到默认FBO目标,通常是屏幕)

对于典型的全屏后处理效果,通常会绘制一个全屏四边形,但当然,您的想象力非常有限(例如,您可以在电视机的网格上绘制FBO内容,以模拟实况摄影机)。同时,可以在片段着色器中执行任何类型的后处理

因此,最简单的方案是:

  • 创建大小和类型正确的纹理(与视口大小相同的f.i.和8位RGB)
  • 通过创建FBO
  • 创建FBO对象本身
  • 通过
    glFramebufferTexture2D将先前创建的纹理附加到颜色附件(
    GL\u color\u ATTACHMENT0
    )​
  • 然后

  • 绑好你的FBO
  • 绘制要进行后处理的内容
  • 绑定默认FBO(即屏幕)
  • 绑定后处理着色器程序
  • (可选)将纹理(现在包含FBO颜色内容)绑定为在纹理单元上处于活动状态,并在着色器程序中将纹理单元索引设置为
    sampler2D
    统一
  • 画一个全屏四元图。在片段着色器中,可以对纹理进行采样并应用任何类型的过滤

  • 请注意,上面执行的操作不是“帧缓冲区闪烁”的意思。blit代表将一个FBO的子矩形复制到另一个FBO的子矩形的能力(当然,您可以只对整个区域进行blit)。此处涉及的固定基地运营商可能包括默认固定基地运营商(即屏幕)。没有通过blit执行后处理的方法,因为没有涉及着色器

    Blitting在特定场景中最有用:将多采样FBO的内容复制到非多采样FBO,然后使用后者执行后处理或作为纹理源。这是因为使用方法大多是历史性的——较旧的GL版本(<3.2)提供了一种通过附加多采样颜色Renderbuffer来创建多采样FBO的方法,但无法读取着色器中的值(Renderbuffer是可以附加到FBO的缓冲区,就像纹理一样,但与纹理不同,不能对其内容进行采样)。因此,我们创建了两个FBO——一个多采样FBO来执行绘图,然后通过blit操作将其解析为第二个非多采样FBO。第二个FBO有一个纹理作为颜色附着,然后可以从中采样

    现在(>=3.2,或使用
    GL\u ARB\u texture\u multisample
    )OpenGL提供了一种创建多采样纹理的方法,可直接在着色器中使用(通过
    sampler2DMS)​采样器)。不需要blit步骤。

    您不会“将FBO作为纹理传递”

    取而代之的是使用纹理作为附件(尤其是颜色附件)创建FBO;然后可以使用此类纹理的内容正常绘制(到默认FBO目标,通常是屏幕)

    对于典型的全屏后处理效果,通常会绘制一个全屏四边形,但当然,您的想象力非常有限(例如,您可以在电视机的网格上绘制FBO内容,以模拟实况摄影机)。同时,可以在片段着色器中执行任何类型的后处理

    因此,最简单的方案是:

  • 创建大小和类型正确的纹理(与视口大小相同的f.i.和8位RGB)
  • 通过创建FBO
  • 创建FBO对象本身
  • 通过
    glFramebufferTexture2D将先前创建的纹理附加到颜色附件(
    GL\u color\u ATTACHMENT0
    )​
  • 然后

  • 绑好你的FBO
  • 绘制要进行后处理的内容
  • 绑定默认FBO(即屏幕)
  • 绑定后处理着色器程序
  • (可选)将纹理(现在包含FBO颜色内容)绑定为在纹理单元上处于活动状态,并在着色器程序中将纹理单元索引设置为
    sampler2D
    统一
  • 画一个全屏四元图。在片段着色器中,可以对纹理进行采样并应用任何类型的过滤

  • 请注意,上面执行的操作不是“帧缓冲区闪烁”的意思。blit代表将一个FBO的子矩形复制到另一个FBO的子矩形的能力(当然,您可以只对整个区域进行blit)。此处涉及的固定基地运营商可能包括默认固定基地运营商(即屏幕)。没有通过blit执行后处理的方法,因为没有涉及着色器

    Blitting在特定场景中最有用:将多采样FBO的内容复制到非多采样FBO,然后使用后者执行后处理或作为纹理源。这是因为使用方法大多是历史性的——较旧的GL版本(<3.2)提供了一种通过附加多采样颜色Renderbuffer来创建多采样FBO的方法,但无法读取着色器中的值(Renderbuffer是可以附加到FBO的缓冲区,就像纹理一样,但与纹理不同,不能对其内容进行采样)。因此,我们创建了两个FBO——一个多采样FBO来执行绘图,然后通过blit操作将其解析为第二个非多采样FBO。第二个FBO有一个纹理作为颜色附着,然后可以从中采样

    这些天(>=3.2,或使用
    GL