Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.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/4/wpf/13.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
android opengl在两个线程上运行的两个上下文之间共享纹理_Android_C++_Multithreading_Opengl Es - Fatal编程技术网

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

主要目标:

在一个线程中创建纹理。在另一个线程中使用纹理

我到目前为止所做的一切

  • 我创建了两个上下文和两个曲面。并使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错误。我认为纹理未成功共享


  • 你能告诉我我做错了什么吗。是否有一些情况下纹理无法共享。

    我认为你遇到了同步问题,这意味着你在context1中渲染纹理,然后立即在context2中查询纹理内容,但你发布到context1的命令尚未完成

    可能您可以在context1的命令缓冲区上设置一个围栏,然后在context2中等待完成

    参考:

    您可以尝试在主线程中调用
    glIsTexture()。这将告诉您纹理是否共享。尽管如此,我认为如果没有共享,您应该从
    glGetError()
    中得到一个错误。运气不好。。glIsTexture正在返回GL_TRUE,并且没有GL错误。这是否意味着共享着色器没有问题?这更可能是纹理本身或您使用它的方式有问题。如果你在主线程中使用相同的代码创建相同的纹理,它会工作吗?是的,在主线程中使用相同的代码,一切都能完美工作。而且如果我尝试在第二个线程中获得生成的纹理,它看起来也不错。很难说。我想说的是:
    glFlush()
    还不够。如果可以使用ES 3.x,您需要一个
    glFinish()
    ,或者某种围栏。