OpenGL ES 2应用程序/进程之间共享渲染曲面(FrameBuffers、Pbuffer等)

Sharing Rendering Surfaces (FrameBuffers, Pbuffers, etc.) between OpenGL ES 2 Applications/Processes

本文关键字:FrameBuffers 曲面 Pbuffer 应用程序 ES 进程 共享 之间 OpenGL      更新时间:2023-10-16

我目前正在使用C++在基于ARM的嵌入式Linux系统上设计一些支持OpenGL ES 2.0的应用程序,我想与另一个应用程序"B"共享应用程序"A"的渲染表面(由OpenGLES2生成的FBO或RenderBuffer或由EGL创建的Pbuffer)。

由于我是OpenGL ES 2的初学者(更重要的是,由于缓冲区位于GPU的内存上,我无法控制或访问),我首先想到在两个进程之间映射一个共享内存对象(例如,长度为width*height*colorComponentCountuint8_t数组,使用POSIX shm_open()等),并定期在应用程序"a"上调用glReadPixels()来填充它,然后将它上传到应用程序"B"中,例如2D纹理。当然,也要使用共享同步机制,例如命名信号量,但这不是我的问题所在:

我知道,从GPU下载缓冲区(即应用程序"a"中的glReadPixels())然后上传回来(即应用软件"B"中的纹理2D)并不是在OpenGL ES应用程序之间共享渲染表面的最佳解决方案,这就是为什么我想知道是否有更好的解决方案?

glReadPixels()方法是OpenGL ES 2.0以可移植、独立于平台的方式实现这一点的唯一方法,而且速度非常慢。如果任何平台真正实现了由EGL(而不是pbuffer)分配的像素映射,那么它们将是好的。

我建议:

实现这些应用程序,使它们以某种方式共享OpenGL ES的公共实例,并使用带有纹理附件的FBO共享图像。如果您需要便携性。

或者,您可以自定义您的linux平台,以便在内核级别或使用实现Pixmap支持的自定义EGL对此提供支持。这些文章将有助于FBO和EGL图像扩展:

http://montgomery1.com/opengl/