【发布时间】:2015-05-26 09:29:28
【问题描述】:
主要目标:
在一个线程中创建纹理。在另一个线程中使用纹理。
到目前为止我做了什么。
-
我创建了两个上下文和两个表面。并使 context1 和 surface1 在主线程中成为当前的。
surface1 = eglCreateWindowSurface(display, config, engine->app->window, NULL); context1 = eglCreateContext(display, config, NULL, attribList); context2 = eglCreateContext(display, config, context1, attribList); eglMakeCurrent(display, surface1, surface1, context1) eglQuerySurface(display, surface1, EGL_WIDTH, &w); eglQuerySurface(display, surface1, EGL_HEIGHT, &h); EGLint attribpbf[] = { EGL_HEIGHT, h, EGL_WIDTH, w, EGL_NONE }; surface2 = eglCreatePbufferSurface(display, config, attribpbf); -
现在我创建了一个新线程,并在该线程中将 context2 和 surface2 设为当前线程。
eglMakeCurrent(display, surface2, surface2, context2); 然后我创建了一个纹理并对纹理进行了一些渲染,然后我执行了 glFlush();
我这里查了一下,纹理创建成功。
之后尝试将此纹理用作主线程中的纹理附件。但结果是一个空白的黑屏。没有GL错误。我认为纹理没有成功共享。
你能告诉我我做错了什么吗?是否存在无法共享纹理的情况。
【问题讨论】:
-
您可以尝试在主线程中调用
glIsTexture()。这会告诉你纹理是否被共享。尽管如此,我认为你应该从glGetError()那里得到一个错误,如果它根本没有共享的话。 -
不走运.. glIsTexture 返回 GL_TRUE 并且没有 gl 错误。这是否意味着共享着色器没有问题??
-
这使得纹理本身或您使用它的方式更有可能出现问题。如果您在主线程中使用相同的代码创建相同的纹理,它是否有效?
-
是的,一切都在主线程中使用相同的代码完美运行。此外,如果我尝试在第二个线程中获取生成的纹理,它看起来也不错。
-
很难说。我的意思是:
glFlush()还不够。如果您可以使用 ES 3.x,您将需要glFinish()或某种栅栏。
标签: android c++ multithreading opengl-es