-1

在我正在创建的应用程序中,我使用了几个按需加载的纹理。直到现在我在主进程中创建了它们并且一切正常。现在我想将它们加载到一个单独的线程中。所以我用beginthread调用加载和绑定纹理的函数加载了纹理,但GL因SHADER_ERROR(1282)失败。我认为OpenGL可能需要一个初始初始化,但我一无所知

我正在用 C++ 编写代码,使用 GL3 和 GLFW 以及 STB 在 WinX64 上使用 GCC 进行图像处理

这里的代码

    GLuint  load_map(const char*filename)
    {
        GLuint texture;
          glGenTextures(1, &texture);
          glBindTexture(GL_TEXTURE_2D, texture); // all upcoming GL_TEXTURE_2D operations now have effect on this texture object

          // set texture filtering parameters
          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);
          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
            // load image
        int width, height, nrChannels;                                                                   
            // 
        unsigned char *data = stbi_load((filename), &width, &height, &nrChannels, STBI_rgb);
          if (data)
          {                                                   LOG1( "LOADED<",width,height); LOG1( "LOADED<",temp,found);
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
        //        glGenerateMipmap(GL_TEXTURE_2D);
          }
          else LOG1( "Failed to load texture","","");

          stbi_image_free(data);            LOG1("load_map","ID>",texture)
          }
          GLenum err =glGetError();    LOG1("load_map","error",err)
return texture;
    }

LOG1 只是记录助手

4

1 回答 1

1

在使用任何 gl 调用之前,必须将上下文设置为使用这些 gl 调用的线程的当前上下文。

对于 GLFW,请使用glfwMakeContextCurrent(GLFWwindow *window)
Yes,即使window由于线程不同,您需要将相同的值设置为 current。

现在,如果您想到不同的线程,所有线程都同时运行以使用 GL,并尝试将相同的上下文设置为当前......不,那是行不通的。

您可以使用多个上下文并在创建窗口时共享它们。但是 GLFW 很简单,AFAIK 你不能为同一个窗口创建多个上下文。

您可以绕过 GLFW 并创建自己的上下文,与 GLFW 共享...我不知道该怎么做。

您不能使用 GLFW 并通过其他库或自己处理上下文和窗口。

关键是共享上下文共享纹理。因此,您可以在一个上下文中上传,并且纹理在该上下文的所有共享上下文中都可用。

但是……总有一个“但是”……当前的大多数显卡在使用多种环境时都没有表现出性能。只有少数允许同时在多个上下文中上传,或同时阅读和绘制。因此,多上下文优势并不是那么大。

您可以在多线程应用程序中执行的操作是在专用线程中将每个图像从磁盘读取到 RAM。并在准备好时将其传递给 GPU,仅在主线程中。

于 2018-11-22T20:21:51.700 回答