首页 > 解决方案 > OpenGL ES 2.0 - 多种后期处理效果

问题描述

你好

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

我成功地使用帧缓冲区对象应用了一个后期处理效果,但我不太明白如何在不重复我的流程步骤的每一步的情况下应用大量后期处理效果,而不必每次都重做每一步。

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

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

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

我错过了什么吗?

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

解决方案


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

但是,许多后处理效果需要对之前的后处理通道的完成结果进行操作。典型的解决方案是设置两个 FBO 并在它们之间进行“乒乓”。因此,如果您有 3 个需要链接的后处理效果,您将有 3 个通道:

  • Pass 1. Texture=Input Data, Shader=Effect1, Render Target=FBO A。
  • Pass 2. Texture=FBO A,Shader=Effect2,Render Target=FBO B。
  • Pass 3. Texture=FBO B,Shader=Effect1,Render Target=FBO A。

我认为您缺少的一点是您可以直接使用帧缓冲区中的纹理,而无需创建一个全新的纹理,其中填充来自glReadPixels. 本教程可能会有所帮助。


推荐阅读