【问题标题】:OpenGL - Pass on the output of multiple programs to a new textureOpenGL - 将多个程序的输出传递给新纹理
【发布时间】:2013-05-15 18:40:39
【问题描述】:

如何将绘制到帧缓冲区的数据传递给新的 openGL 程序或纹理?

我现在正在做的用例:

  • 从 UIImage 创建纹理
  • 通过将其绑定为 GL_TEXTURE_2D 并对其进行处理,将其作为 uniform sampler2D 传递
  • 切换程序并在图像顶部渲染例如晕影
  • 切换程序并在此之上渲染各种图形

这一切都很好。问题是,从这里开始,我想使用额外的 OpenGL 着色器来处理上述所有内容。例如亮度/对比度过滤器。不仅适用于图像,还适用于所有添加的图形和小插图。添加后,我想将其传递给其他可选程序等。

但是这是怎么做到的呢?我知道我可以将其作为纹理缓存读回或使用 glReadPixels() 并创建一个新纹理以传递,但肯定有更好、更有效的方法吗?一个完全使用 GPU 内存的?

【问题讨论】:

    标签: ios opengl-es opengl-es-2.0


    【解决方案1】:

    您要做的是将某些内容直接渲染到纹理中,而不是显示帧缓冲区。而这正是 Framebuffer Objects (FBO) 的用途。一个 FBO 代表一个完整的帧缓冲区及其所有子缓冲区(如多个颜色缓冲区、深度缓冲区、模板缓冲区或这些缓冲区的子集),但具有附加自定义数据容器(如渲染缓冲区或纹理)作为单独的功能缓冲区,从而直接渲染到您控制的某些 GPU 内存区域。有关这些的教程,请参阅 herehere 以获得更多“官方”和完整信息(尽管后者也可能讨论 ES 中不存在的现代桌面 GL 版本的功能),或 herehere更多 ES 相关信息(不过应该与桌面 GL 没有太大区别)

    【讨论】:

    • 完美。 Apple 链接“使用帧缓冲对象渲染到纹理”中的部分正是我所追求的。谢谢。
    【解决方案2】:

    您需要使用帧缓冲区对象,它允许您渲染到默认帧缓冲区以外的渲染目标,例如2D 纹理。

    这里有一些网站,您可以阅读更多关于它们的信息:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多