在OpenGL ES 2应用程序/进程之间共享渲染表面(帧缓冲区、PBuffer等) 我现在在使用ARC++的嵌入式Linux系统上设计了一些OpenGL ES 2.0启用的应用程序,我想和另一个应用程序“B”共享应用程序“A”的渲染表面(由RenderBuffer或OpenGLAS2生成的FBO或Pbuffer)。

在OpenGL ES 2应用程序/进程之间共享渲染表面(帧缓冲区、PBuffer等) 我现在在使用ARC++的嵌入式Linux系统上设计了一些OpenGL ES 2.0启用的应用程序,我想和另一个应用程序“B”共享应用程序“A”的渲染表面(由RenderBuffer或OpenGLAS2生成的FBO或Pbuffer)。,c++,opengl-es,opengl-es-2.0,embedded-linux,C++,Opengl Es,Opengl Es 2.0,Embedded Linux,由于我是OpenGL ES 2的初学者(更重要的是,由于缓冲区位于GPU的内存中,我无法控制或访问),我首先想到映射一个共享内存对象(例如,一个长度width*height*colorComponentCount数组,使用POSIXshm\u open()等)在两个进程之间,定期调用应用程序“A”上的glReadPixels(),以填充它,然后将其作为2D纹理上载到应用程序“B”中。当然,也要使用共享同步机制,例如命名信号量,但这不是我问题的重点: 我知道,从GPU下载缓冲区(即应用程序“a”中

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

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

glReadPixels()对于OpenGL ES 2.0来说,这种方法是以可移植的、独立于平台的方式实现的唯一方法,而且速度非常慢。如果任何平台实际实现了EGL(而不是pbuffers)分配的Pixmaps,那么它们将是好的

我建议:

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

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

http://montgomery1.com/opengl/

谢谢你的回答。正如您可能已经猜到的,我确实更喜欢平台独立性/可移植性(在这一点上,修补Linux平台不是一个选项)。此外,程序/进程需要独立(除了共享渲染表面或通常用于将一个应用程序的渲染结果传递给另一个应用程序的机制),我确实看过了,但我还没有找到用于操作Pixmaps的示例代码,我仍在搜索(我不知道我使用的平台是否实现了它们,我可能应该编写一个测试程序来检查它)。遗憾的是,没有涵盖诸如在进程之间共享渲染曲面之类的主题…是的,这是一个遗憾。Pixmaps旨在解决此问题,但我从未见过一个平台以可用的形式实际实现它们,除了iOS和Android可能有自己的GraphicBuffer。通过ugh共享内存真的不够用……有没有办法直接在GPU上寻址缓冲区?这取决于平台。Android和iOS都有,一些嵌入式linux平台(飞思卡尔)也实现了EGL镜像扩展。