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

问题描述 投票:0回答:1

你好

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

我成功地使用Framebuffer对象来应用一个后期处理效果,但我不太明白,如果不重复我的过程中的每一步,我可以应用多种后期处理效果,而无需每次都重做每一步。

我现在要完成的步骤如下:

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

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

我错过了什么吗?

c++ opengl-es-2.0 post-processing
1个回答
1
投票

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

然而,许多后处理效果需要对先前后处理过程的完成结果进行操作。典型的解决方案是在它们之间设置两个FBO和“乒乓”。所以,如果你有3个需要链接的后期处理效果,你将获得3次传递:

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

我认为你缺少的是你可以直接使用帧缓冲的纹理而不必创建一个填充了glReadPixels数据的全新纹理。这个tutorial可能有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.