我可以在 2 个 OpenGL 上下文之间共享外部纹理吗? Android

Mic*_*l P 9 c++ java multithreading android opengl-es

我正在创建 2 个线程。每个线程都有自己的 EGL 上下文。一个线程在本机中,我将渲染到纹理,另一个线程在 Java 中,我想从该纹理中采样并渲染到屏幕/编码器(无关紧要)。我无法让它发挥作用。我尝试在任一线程上生成纹理。我注意到纹理 ID 在两个线程上都是重复的(我有其他不打算共享的纹理)。

我的问题是,是否可以在两个线程(和上下文)之间共享纹理?

编辑:解决方案

感谢 Andon 和一些谷歌搜索,我能够让它工作。我在线程一上用 Java 创建了一个上下文,并调用eglGetCurrentContext()C++ 来获取 EGLContext。后来,我在第二个线程上用 C++ 创建了第二个上下文:

eglCreateContext(mEglDisplay, mEglConfig, sharedContext, contextAttribs);

其中sharedContext是第一个上下文。

And*_*man 3

是的,上下文之间的资源共享是可能的。

然而,共享上下文中的命令流并不同步;如果您在一个线程中上传数据并在另一个线程中使用它,您必须格外小心,上传实际上首先完成(glFinish (...)然后是您自己的一些同步构造,例如信号量)。

现在,一个价值百万美元的问题——你对这些环境的创建有任何控制权吗?这是在 EGL 中进行资源共享所必需的。您只需要自己创建一个即可;如果您已经获得了另一个,则可以在创建第二个时将其用作共享上下文。