gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:33:16 25 4
gpt4 key购买 nike

您好

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

我成功地使用 Framebuffer 对象 应用了一个后期处理效果,但我不太明白,如果不重复我过程中的每一步,我是如何应用大量后期处理效果的无需每次都重做每一步。

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

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

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

我错过了什么吗?

最佳答案

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

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

  • 第 1 步。纹理 = 输入数据,着色器 = 效果 1,渲染目标 = FBO A。
  • 第 2 步。Texture=FBO A,Shader=Effect2,Render Target=FBO B。
  • 第 3 步。Texture=FBO B,Shader=Effect1,Render Target=FBO A。

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

关于c++ - OpenGL ES 2.0 - 多种后期处理效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52290278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com