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

В приложении, которое я создаю, я использую несколько текстур, которые загружаю по требованию.
До сих пор я создал их в основном процессе, и все работает отлично.
Теперь я хотел загрузить их в отдельном потоке.
Поэтому я вызываю функцию для загрузки и связывания текстуры с 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 и обрабатывать контексты и окна с какой-либо другой библиотекой или самостоятельно.

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]