无法在线程中创建纹理

时间:2018-11-22 18:19:13

标签: c++ opengl glfw beginthread

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

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

此处是代码

    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只是日志帮助程序

1 个答案:

答案 0 :(得分:1)

在使用任何gl-call之前,必须将 context 设置为当前使用这些gl-call的线程。

对于GLFW,请使用glfwMakeContextCurrent(GLFWwindow *window)
是的,由于线程不同,即使您需要将window的值设置为当前值,也是如此。

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

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

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

您不能使用GLFW来与其他库一起或单独使用上下文和窗口。

重点是共享上下文共享纹理。因此,您可以在一个上下文中上载,并且该上下文在所有共享上下文中都可以使用纹理。

但是...总是有一个“ but” ...大多数当前的图形卡在使用多个上下文时都没有表现出性能。仅有几个允许同时在多个上下文中上传,或者同时阅读和绘制。因此,多上下文的优势并不是很大。

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