【问题标题】:Using a framebuffer object as a texture in a shader在着色器中使用帧缓冲区对象作为纹理
【发布时间】:2014-07-07 02:00:32
【问题描述】:

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

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

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

【问题讨论】:

  • 对不起,您的问题没有多大意义,请您详细说明一下?
  • @peppe 现在好点了吗?

标签: opengl fbo


【解决方案1】:

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

相反,您创建一个 FBO,使用纹理作为附件(特别是颜色附件);然后您可以使用此类纹理的 contents 正常绘制(到默认的 FBO 目标,通常是屏幕)。

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

所以,最简单的计划是:

  1. 创建正确大小和类型的纹理(f.i. 与视口大小相同,以及 8 位 RGB)
  2. 通过以下方式创建 FBO
    1. 自行创建 FBO 对象
    2. 通过glFramebufferTexture2D​将先前创建的纹理附加到颜色附件(GL_COLOR_ATTACHMENT0

然后

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

请注意,上面执行的操作不是“帧缓冲块”的含义。 Blitting 表示将 FBO 的子矩形复制到另一个 FBO 的子矩形中的能力(当然,您可以只对整个区域进行 blit)。这里涉及的 FBO 可能包括默认的 FBO(即屏幕)。由于不涉及着色器,因此无法通过 blit 执行后处理。

Blitting 在特定场景中最有用:将多重采样 FBO 的内容复制到非多重采样 FBO 中,然后使用后者执行后期处理或作为纹理源。这样做的原因主要是历史原因——旧的 GL 版本 (multisampled color Renderbuffer 来创建多重采样 FBO 的方法,但无法在着色器(渲染缓冲区是可以附加到 FBO 的缓冲区,就像纹理一样,但与纹理不同的是,您不能对其内容进行采样)。因此,一个人创建了两个 FBO——一个多重采样的FBO来执行绘图,然后通过blit操作将其解析为第二个非多重采样的FBO。第二个 FBO 附加了一个纹理作为颜色附件,然后您可以从中采样。

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

【讨论】:

  • 那么,“FBO blitting”代表什么?
  • 在正文中详述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 2012-03-28
  • 2011-05-21
  • 2014-12-05
相关资源
最近更新 更多