android opengl在两个线程上运行的两个上下文之间共享纹理
主要目标: 在一个线程中创建纹理。在另一个线程中使用纹理 我到目前为止所做的一切android opengl在两个线程上运行的两个上下文之间共享纹理,android,c++,multithreading,opengl-es,Android,C++,Multithreading,Opengl Es,主要目标: 在一个线程中创建纹理。在另一个线程中使用纹理 我到目前为止所做的一切 我创建了两个上下文和两个曲面。并使context1和surface1在主线程中处于当前状态 surface1 = eglCreateWindowSurface(display, config, engine->app->window, NULL); context1 = eglCreateContext(display, config, NULL, attribList); co
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);
eglMakeCurrent(display, surface2, surface2, context2);
你能告诉我我做错了什么吗。是否有一些情况下纹理无法共享。我认为你遇到了同步问题,这意味着你在context1中渲染纹理,然后立即在context2中查询纹理内容,但你发布到context1的命令尚未完成 可能您可以在context1的命令缓冲区上设置一个围栏,然后在context2中等待完成 参考:
您可以尝试在主线程中调用
glIsTexture()。这将告诉您纹理是否共享。尽管如此,我认为如果没有共享,您应该从glGetError()
中得到一个错误。运气不好。。glIsTexture正在返回GL_TRUE,并且没有GL错误。这是否意味着共享着色器没有问题?这更可能是纹理本身或您使用它的方式有问题。如果你在主线程中使用相同的代码创建相同的纹理,它会工作吗?是的,在主线程中使用相同的代码,一切都能完美工作。而且如果我尝试在第二个线程中获得生成的纹理,它看起来也不错。很难说。我想说的是:glFlush()
还不够。如果可以使用ES 3.x,您需要一个glFinish()
,或者某种围栏。