使用framebuffer对象作为着色器中的纹理

时间:2014-07-06 11:15:39

标签: opengl fbo

我可以使用FBO blitting https://www.opengl.org/registry/specs/EXT/framebuffer_blit.txt将渲染的FBO作为纹理传递给我的解析着色器输入吗?

我可以使用FBO作为着色器的输入" sampler2D"?

我的意思是,我为fbo渲染了一些东西。现在我想要后处理图像,我可以将FBO作为纹理传递给着色器吗?

1 个答案:

答案 0 :(得分:8)

你不会将FBO作为纹理传递#34;。

相反,您使用纹理作为附件创建FBO(特别是对于颜色附件);然后你可以使用这种纹理的内容正常绘制(到默认的FBO目标,通常是屏幕)。

对于典型的全屏后期处理效果,通常会绘制全屏四边形,但当然你几乎只限于自己的想象力(例如你可以在电视机的网格上绘制FBO内容,模拟现场摄像头)。同时,您可以在片段着色器中执行任何类型的后处理。

所以,最简单的计划是:

  1. 创建大小和类型正确的纹理(f.i.与视口大小相同,8位RGB)
  2. 创建一个FBO
    1. 创建FBO对象本身
    2. 通过GL_COLOR_ATTACHMENT0
    3. 将之前创建的纹理附加到颜色附件(glFramebufferTexture2D​
  3. 然后

    1. 绑定你的FBO
    2. 绘制您要后期处理的内容
    3. 绑定默认FBO(即屏幕)
    4. 绑定您的后处理着色器程序
    5. (可选)将纹理(现在持有FBO颜色内容)绑定到纹理单元上,并在着色器程序中将纹理单元索引设置为sampler2D制服
    6. 绘制全屏四边形。在片段着色器中,您可以对纹理进行采样并应用任何类型的过滤。

    7. 请注意,上面执行的操作不是对于#buffer blitting"的含义。 Blitting代表将FBO的子矩形复制到另一个FBO的子矩形中的能力(当然,您可以只对整个区域进行blit)。这里涉及的FBO可以包括默认FBO(即屏幕)。没有办法通过blit执行后处理,因为没有涉及着色器。

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

      这些天(> = 3.2,或GL_ARB_texture_multisample)OpenGL提供了一种创建多重采样纹理的方法,可直接在着色器中使用(通过sampler2DMS​采样器)。不需要快速步骤。