gpt4 book ai didi

c++ - 在 OpenGL ES 2 应用程序/进程之间共享渲染表面(FrameBuffers、Pbuffers 等)

转载 作者:行者123 更新时间:2023-11-28 06:55:45 26 4
gpt4 key购买 nike

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

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

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

最佳答案

glReadPixels() 方法是 OpenGL ES 2.0 以可移植的、平台独立的方式执行此操作的唯一方法,而且速度非常慢。如果任何平台实际实现了由 EGL(不是 pbuffers)分配的像素图,它们会很好。

我推荐:

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

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

http://montgomery1.com/opengl/

关于c++ - 在 OpenGL ES 2 应用程序/进程之间共享渲染表面(FrameBuffers、Pbuffers 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23204492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com