OpenGL ES 2应用程序/进程之间共享渲染曲面(FrameBuffers、Pbuffer等)
Sharing Rendering Surfaces (FrameBuffers, Pbuffers, etc.) between OpenGL ES 2 Applications/Processes
我目前正在使用C++在基于ARM的嵌入式Linux系统上设计一些支持OpenGL ES 2.0的应用程序,我想与另一个应用程序"B"共享应用程序"A"的渲染表面(由OpenGLES2生成的FBO或RenderBuffer或由EGL创建的Pbuffer)。
由于我是OpenGL ES 2的初学者(更重要的是,由于缓冲区位于GPU的内存上,我无法控制或访问),我首先想到在两个进程之间映射一个共享内存对象(例如,长度为width*height*colorComponentCount
的uint8_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/
- OpenCascade:从 IGES 读取修剪曲面
- CGAL:如何创建填充边界曲线的曲面网格?
- 如何从 3D 曲面网格中删除自相交三角形?
- 在使用 SDL2 从曲面创建的纹理上渲染纹理
- 如何在 DirectX 11 中使用曲面细分绘制虚线图案 3D 线
- 如何在三角形曲面细分评估着色器中插值 UV 映射坐标?
- CGAL 曲面网格 - 修改顶点坐标
- 如何将三角孔贴片转换为曲面网格
- 使用 gnuplot 制作 3D 曲面图
- 在曲面中插入边-CGAL错误:断言冲突
- 为什么我创建的曲面无法加载?
- SDL在析构函数上释放曲面失败
- 在 openGL 中绘制平面曲面
- 碰撞后从方向抵消曲面轴
- 将曲面保存到不带DirectX的文件(d3dx9_43.dll)
- 复制PCL点云,同时保留组织或Ransac+曲面法线计算
- 局部曲面拟合到 3d 点
- OpenGL:具有三角测量的贝塞尔曲面
- 如何在SDL1.2曲面上高效地更新单个像素
- OpenGL ES 2应用程序/进程之间共享渲染曲面(FrameBuffers、Pbuffer等)