Multithreading 如何在openGL中创建多线程上下文

Multithreading 如何在openGL中创建多线程上下文,multithreading,opengl-es,opengl-es-2.0,egl,Multithreading,Opengl Es,Opengl Es 2.0,Egl,我不太了解openGL,但我有一个在主UI线程中创建的上下文: eglGetDisplay(EGL_DEFAULT_DISPLAY); eglCreateWindowSurface(..) eglCreateContext(..) eglMakeCurrent(...) 但现在我还想在背景线程中进行一些图形操作(主要是创建纹理,然后将这些纹理发送到主ui线程中进行绘制)。但是我不知道如何在第二个线程中初始化第二个上下文(或者如何在第二个线程中使用第一个上下文):(也许我必须在第二个线程中使用e

我不太了解openGL,但我有一个在主UI线程中创建的上下文:

eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglCreateWindowSurface(..)
eglCreateContext(..)
eglMakeCurrent(...)
但现在我还想在背景线程中进行一些图形操作(主要是创建纹理,然后将这些纹理发送到主ui线程中进行绘制)。但是我不知道如何在第二个线程中初始化第二个上下文(或者如何在第二个线程中使用第一个上下文):(也许我必须在第二个线程中使用eglCreatePbufferSurface?我不知道


提前感谢您的帮助!

上下文仅为单线程:OpenGL是一个高度模态化的API,因此允许多个线程同时使用同一上下文将是痛苦的-如果线程1调用
glBindTexture
,那么它如何知道它没有被线程2中断,从而生成不同的
glBindTexture
在下一个语句之前打电话

但是,
eglCreateContext
的第三个参数定义为:

共享上下文

指定要使用的另一个EGL呈现上下文 共享数据,由对应于 上下文。数据还与所有其他与其相关的上下文共享 共享上下文共享数据。
EGL\u NO\u context
表示不允许共享 发生

(规范中有一条警告,纹理0是不可共享的;如果您始终只使用
glGenTextures
的结果作为ID,则不要担心它)

因此,您的背景上下文需要将原始上下文指定为共享上下文。然后它拥有自己的上下文。它可以继续执行创建纹理的昂贵工作。完成后,它生成的纹理名称可以交给主线程,并且应该可以在其上下文中使用


唯一需要注意的是主线程上的命令队列与后台的命令队列之间可能存在的同步问题。可能最安全的做法是在后台调用
glFinish
,以确保所有工作都已完成,将纹理ID传递到前台,然后在该上下文中调用
glFlush
,以刷新UNUbmited命令队列。

ooh谢谢tommy,据我在::Thread2中了解,我需要创建另一个与::Thread1共享的上下文,对吗?但是如何在后台线程中创建上下文,使用EGLCreateWindowsSurface或eglCreatePbufferSurface?是否需要曲面?如果不需要,那么我的假设(警告:未经检查)就是你不能-执行纹理上传,交出它们,永远不要对绘图命令感兴趣。否则我认为
eglCreatePbufferSurface
,因为它们是用于屏幕外绘制的,没有相关的窗口。这可能是你想要的只是用于处理和上传资源的上下文。