В приложении, которое я создаю, я использую несколько текстур, которые загружаю по требованию.
До сих пор я создал их в основном процессе, и все работает отлично.
Теперь я хотел загрузить их в отдельном потоке.
Поэтому я вызываю функцию для загрузки и связывания текстуры с 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 просто помощник при входе
Перед тем, как использовать любой gl-вызов, контекст должен быть установлен как текущий для потока, в котором используются эти вызовы gl.
Для GLFW используйте glfwMakeContextCurrent(GLFWwindow *window)
Да хоть с тем же window
значение, которое нужно установить как текущее, из-за другого потока.
Теперь, если вы подумаете о разных потоках, которые все работают одновременно с использованием GL и пытаются установить в качестве текущего один и тот же контекст … НЕТ, это не сработает.
Вы можете использовать несколько контекстов и доля их при создании окна. Но GLFW прост, AFAIK, вы не можете создать несколько контекстов для одного и того же окна.
Вы можете обойти GLFW и создать свой собственный контекст, которым поделились с GLFW … Я не знаю, как это сделать.
Вы не можете использовать GLFW и обрабатывать контексты и окна с какой-либо другой библиотекой или самостоятельно.
Дело в том, что общие контексты поделитесь текстурами. Таким образом, вы можете загрузить в одном контексте, и текстура доступна во всем общем контексте с этим контекстом.
Но … всегда есть «но» … большинство современных видеокарт не показывают производительность при использовании нескольких контекстов. Лишь немногие позволяют загружать в нескольких контекстах одновременно или читать и рисовать одновременно. Таким образом, многоконтекстное преимущество не так велико.
В многопоточном приложении вы можете читать каждое изображение с диска в ОЗУ в отдельном потоке. И передать его в графический процессор, когда он будет готов, только в главном потоке.
Других решений пока нет …