OpenGL - 将多个程序的输出传递给新纹理

时间:2013-05-15 09:51:48

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

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

使用我现在正在做的事情:

  • 从UIImage创建纹理
  • uniform sampler2D绑定为GL_TEXTURE_2D并将其处理
  • ,将其作为{{1}}传递
  • 切换程序并在图像顶部渲染一个小插图
  • 切换程序并在其上呈现各种图形

一切正常。问题是,从这里我想使用额外的OpenGL着色器处理所有上述内容。示例亮度/对比度滤镜。不只是图像,而是所有添加的图形和插图。一旦添加了,我想将其传递给其他可选程序,依此类推。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

这里有一些您可以阅读更多相关信息的网站: