【发布时间】:2015-08-12 01:06:05
【问题描述】:
我正在创建 2 个线程。每个线程都有自己的 EGL 上下文。 一个线程是原生的,我将在其中渲染到纹理,另一个线程在 Java 中,我想从该纹理中采样并渲染到屏幕/编码器(没关系)。 我不能让它工作。 我尝试在任一线程上生成纹理。我注意到纹理 ID 在两个线程上重复(我有其他不打算共享的纹理)。
我的问题是,是否可以在 2 个线程(和上下文)之间共享纹理?
编辑:解决方案
多亏了 Andon 和一些谷歌搜索,我才得以成功。我在线程一上用 Java 创建了一个上下文,并调用了 eglGetCurrentContext() 来获取 C++ 中的 EGLContext。后来,我在第二个线程上用 C++ 创建了第二个上下文:
eglCreateContext(mEglDisplay, mEglConfig, sharedContext, contextAttribs);
其中 sharedContext 是第一个上下文。
【问题讨论】:
-
围栏同步对象将是同步的首选方法,但我认为您在 OpenGL ES 中没有这些? (顺便说一句,您的问题被标记错误 - 它应该是 OpenGL ES)
-
您在标题中说“外部纹理”,但在未提及的问题中,听起来您只是在使用常规的 OpenGL 纹理。你能澄清一下是哪一个吗?
-
是的,我正在使用外部纹理。
-
使用外部纹理,您应该能够在不在同一个共享组中的上下文之间共享图像数据。它们甚至在进程之间工作。当然,每个共享组中都需要一个纹理对象,但纹理可以由同一图像支持。尽管如此,只要一切都在同一个过程中,就没有必要为外部纹理而烦恼。将上下文放在同一个共享组中并使用常规纹理可能要简单得多。
-
Grafika (github.com/google/grafika) 中的“显示 + 捕获相机”活动执行此操作,共享从相机接收到的外部纹理与不同线程中的两个 EGL 上下文(一个在屏幕上绘制,一个馈送MediaCodec 编码器)。它变得有点棘手,因为显示上下文由 GLSurfaceView 管理,这并不是共享的全部内容。
标签: java android c++ multithreading opengl-es