OpenGL ES 2.0-多种后期处理效果

时间:2018-09-12 08:01:10

标签: c++ opengl-es-2.0 post-processing

你好

我想使用OpenGL ES将多种图像处理效果应用于输入纹理。

我成功地尝试使用 Framebuffer Object 来应用一种后处理效果,但是我不十分了解,如果不重复过程中的每一步,我可以应用多种后处理效果不必每次都重做。

我现在要执行的步骤如下:

  1. 加载我的着色器并获得所需的位置以传输数据
  2. 初始化我的FBO
  3. 使用我的输入数据创建纹理
  4. 绑定FBO
  5. 激活TEXTURE0并绑定先前生成的纹理
  6. 使用获取的位置发送数据
  7. 绘制全屏四边形并使其使用我的着色器程序
  8. 读取FBO纹理(使用glReadPixels)并将结果保存到图像中
  9. 取消绑定以进行清理。

据我所知,我确实需要使用其他后期处理着色器重复步骤5、6、7,并使用我终于在步骤8中得到的纹理,但是我认为这不是正确的方法强迫我从FBO读取数据到纹理中,然后重新传输它们,这确实很昂贵。

我想念什么吗?

1 个答案:

答案 0 :(得分:1)

如果可以在单个着色器中完成2种后期处理效果,则应该这样做,因为这样的效率会更高,因为读取和写入整个帧缓冲区的内存带宽成本通常使一些额外的着色器计算的成本相形见war

但是,许多后期处理效果需要对先前后期处理遍的最终结果进行操作。典型的解决方案是设置两个FBO,并在它们之间设置“乒乓”。因此,如果您需要链接3个后期处理效果,那么您将获得3个通过:

  • 第1遍。纹理=输入数据,着色器=效果1,渲染目标= FBO A。
  • 第2遍。纹理= FBO A,着色器=效果2,渲染目标= FBO B。
  • 第3遍。纹理= FBO B,着色器=效果1,渲染目标= FBO A。

我认为您缺少的一点是,您可以直接使用帧缓冲区中的纹理,而不必创建填充来自glReadPixels的数据的全新纹理。这个tutorial可能会有帮助。