我目前正在使用C ++在基于ARM的嵌入式Linux系统上设计一些支持OpenGL ES 2.0的应用程序,我想分享应用程序的渲染表面(由OpenGLES2生成的FBO或RenderBuffer或由EGL创建的Pbuffer) “A”与另一个应用程序“B”。
由于我是OpenGL ES 2 的初学者(更重要的是,因为缓冲区位于我无法控制或访问的GPU内存上),我首先考虑映射a共享内存对象(例如,长度为uint8_t
的{{1}}数组,在两个进程之间使用POSIX width*height*colorComponentCount
等)并定期调用应用程序“A”上的shm_open()
以填充它然后在应用程序“B”中上传它,例如,2D纹理。当然,也可以使用共享同步机制,例如命名信号量,但这不是我的问题:
我知道从GPU下载缓冲区(即应用程序“A”中的glReadPixels()
)然后将其上传回来(即应用程序“B”中的纹理2D)不是最佳在OpenGL ES应用程序之间共享渲染表面的解决方案,这就是为什么我想知道是否有更好的解决方案?
答案 0 :(得分:1)
glReadPixels()方法是以可移植,独立于平台的方式为OpenGL ES 2.0实现它的唯一方法,它非常慢。如果任何平台实际实现了它们,那么由EGL(而不是pbuffers)分配的Pixmaps会很好。
我建议:
实施应用程序,以便它们以某种方式共享OpenGL ES的公共实例,并使用具有纹理附件的FBO来共享图像。如果你需要便携性。
或者,您可以自定义Linux平台,以便在内核级别或使用实现Pixmap支持的自定义EGL提供支持。这些文章将有助于FBO和EGL图像扩展:
http://montgomery1.com/opengl/