Не удается создать текстуру в потоке

В приложении, которое я создаю, я использую несколько текстур, которые загружаю по требованию. До сих пор я создал их в основном процессе, и все работает отлично. Теперь я хотел загрузить их в отдельном потоке. Поэтому я вызываю функцию для загрузки и связывания текстуры с beginthread. Текстура загружена, но GL завершается ошибкой с SHADER_ERROR (1282). Я предполагаю, что OpenGL, вероятно, нужен начальный init, но я не в курсе

Я кодирую в C++, компилирую с GCC на WinX64, используя 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 ответ

Решение

Перед использованием любого gl-вызова контекст должен быть установлен как текущий для потока, в котором используются эти gl-вызовы.

Для GLFW используйте glfwMakeContextCurrent(GLFWwindow *window)
Да хоть с тем же window значение, которое нужно установить как текущее, из-за другого потока.

Теперь, если вы подумаете о разных потоках, которые все работают одновременно с использованием GL и пытаются установить в качестве текущего один и тот же контекст... НЕТ, это не сработает.

Вы можете использовать несколько контекстов и делиться ими при создании окна. Но GLFW прост, AFAIK, вы не можете создать несколько контекстов для одного и того же окна.

Вы можете обойти GLFW и создать свой собственный контекст, которым поделились с GLFW... Я не знаю, как это сделать.

Вы не можете использовать GLFW и обрабатывать контексты и окна с какой-либо другой библиотекой или самостоятельно.

Дело в том, что общие контексты имеют общие текстуры. Таким образом, вы можете загрузить в одном контексте, и текстура доступна во всем общем контексте с этим контекстом.

Но... всегда есть "но"... большинство современных видеокарт не показывают производительность при использовании нескольких контекстов. Лишь немногие позволяют загружать в нескольких контекстах одновременно или читать и рисовать одновременно. Таким образом, многоконтекстное преимущество не так велико.

В многопоточном приложении вы можете читать каждое изображение с диска в ОЗУ в отдельном потоке. И передать его в графический процессор, когда он будет готов, только в главном потоке.

Другие вопросы по тегам