Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以在两个OpenGL上下文(Android)之间共享外部纹理吗_Java_Android_C++_Multithreading_Opengl Es - Fatal编程技术网

Java 我可以在两个OpenGL上下文(Android)之间共享外部纹理吗

Java 我可以在两个OpenGL上下文(Android)之间共享外部纹理吗,java,android,c++,multithreading,opengl-es,Java,Android,C++,Multithreading,Opengl Es,我正在创建两个线程。每个线程都有自己的EGL上下文。 一个线程是本机线程,我将渲染到纹理,另一个线程是Java线程,我希望从该纹理采样并渲染到屏幕/编码器(无所谓)。 我做不到。 我已经尝试在两条线中的任何一条上生成纹理。我注意到两个线程上的纹理ID都是重复的(我还有其他不打算共享的纹理) 我的问题是,是否可以在两个线程(和上下文)之间共享纹理 编辑:解决方案 多亏了安登和一些谷歌搜索,我才能够让它工作。我在爪哇上创建了一个线程1,并调用了 EgGETCurrrnCutExtEnter()/Cu

我正在创建两个线程。每个线程都有自己的EGL上下文。 一个线程是本机线程,我将渲染到纹理,另一个线程是Java线程,我希望从该纹理采样并渲染到屏幕/编码器(无所谓)。 我做不到。 我已经尝试在两条线中的任何一条上生成纹理。我注意到两个线程上的纹理ID都是重复的(我还有其他不打算共享的纹理)

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

编辑:解决方案

多亏了安登和一些谷歌搜索,我才能够让它工作。我在爪哇上创建了一个线程1,并调用了<代码> EgGETCurrrnCutExtEnter()/Cuffe >以获得C++中的EGLLeValk。后来,我在第二个线程中用C++创建了第二个上下文:

eglCreateContext(mEglDisplay、mEglConfig、sharedContext、contextAttribs)


其中sharedContext是第一个上下文。

是的,可以在上下文之间共享资源

但共享上下文中的命令流不同步;如果您在一个线程中上载数据,并在另一个线程中使用它,那么您必须格外小心,确保上载实际上首先完成(
glFinish(…)
,然后是您自己的一些同步构造,如信号量,就可以了)


现在,百万美元的问题是,你能控制这些上下文的创建吗?这对于在EGL中进行资源共享是必要的。你只需要自己创造一个;如果您已经有了另一个对象,您可以在创建第二个对象时将其用作共享上下文。

围栏同步对象将是首选的同步方法,但我认为您在OpenGL ES中没有这些对象?(顺便说一句,你的问题被标记错了-应该是OpenGL ES)你在标题中说“外部纹理”,但在没有提到的问题中,听起来你只是在使用普通的OpenGL纹理。你能澄清它是哪一个吗?是的,我使用的是外部纹理。使用外部纹理,你应该能够在不在同一共享组中的上下文之间共享图像数据。它们甚至在进程之间工作。当然,在每个共享组中都需要一个纹理对象,但是纹理可以由同一个图像支持。不过,只要所有东西都在同一个过程中,就没有必要为外部纹理而烦恼。将上下文放在同一个共享组中并使用常规纹理可能要简单得多。Grafika()中的“show+capture-camera”活动可以做到这一点,它将从摄影机接收到的外部纹理与不同线程中的两个EGL上下文共享(一个在屏幕上绘制,一个向MediaCodec编码器馈送)。它变得有点粘,因为显示上下文是由GLSurfaceView管理的,而GLSurfaceView并不完全用于共享。我完全可以控制这两个上下文。我正在创造它们。glFinish做什么?正如我提到的,它没有起作用。在一个线程上对纹理的渲染有效。但是当我从另一个线程的纹理Id中采样时,在另一个上下文中。我得到一个空白屏幕。@MichaelP:
glFinish(…)
阻塞,直到所有指向它的命令都完成为止。否则,GL倾向于将命令放入队列,并在GPU到达时执行它们。这通常是好的,但当你在进行多线程渲染时,它是坏的,坏的,坏的。在一个线程中生成纹理后,需要立即调用
glFinish(…)
,一旦该命令返回,就可以向渲染线程发出信号,表示有有效的纹理数据等待绘制。否则,两个线程会异步运行,这将是一个混乱的局面。@MichaelP:通常在单线程/单上下文渲染场景中,您不必考虑这些内容,GL会自动执行这种同步。但是,当您使用两个单独的上下文时,它们都并行执行命令,您需要确保命令执行的顺序是一致的。但是,如果您不通过将其中一个上下文传递到
eglCreateContext(…)
来将其建立为共享上下文,则所有这些都将不起作用。它起作用了!谢谢@Andon我将用解决方案更新问题