如何在openGL

时间:2016-04-11 13:44:54

标签: multithreading opengl-es opengl-es-2.0 egl

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

eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglCreateWindowSurface(..)
eglCreateContext(..)
eglMakeCurrent(...)

但是现在我想在后台线程中做一些图形操作(主要是为了创建纹理,然后在主ui线程中发送那些要绘制的纹理)。但我不知道如何初始化第二个线程中的第二个上下文(或如何在第二个线程中使用第一个上下文):(也许我必须在我的第二个线程中使用eglCreatePbufferSurface?我不知道...

感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

上下文只是单线程:OpenGL是一个高模态的API,因此允许多个线程同时使用相同的上下文会很痛苦 - 如果线程1调用glBindTexture那么它如何知道它没有被中断线程2,在进入下一个语句之前进行不同的glBindTexture调用?

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

  

share_context

     

指定用于的另一个EGL渲染上下文   共享数据,由客户端API定义,对应于   上下文。数据也与所有其他上下文共享   share_context共享数据。 EGL_NO_CONTEXT表示不共享   发生。

(规范中的警告警告纹理0不可共享;如果您一直只使用glGenTextures的结果作为您的ID,那么不要担心它)

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

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