无法在线程中创建纹理
failing create a texture in a thread
在我正在创建的应用程序中,我使用了几个按需加载的纹理。
直到现在我在主进程中创建了它们并且一切正常。
现在我想将它们加载到一个单独的线程中。
所以我用 beginthread 调用加载和绑定纹理的函数
纹理已加载,但 GL 失败并显示 SHADER_ERROR (1282)。
我假设 OpenGL 可能需要一个初始初始化,但我一无所知
我正在用 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 只是日志助手
在使用任何 gl 调用之前,必须将 context 设置为使用这些 gl 调用的线程的当前线程。
对于 GLFW,使用 glfwMakeContextCurrent(GLFWwindow *window)
是的,即使使用相同的 window
值,您也需要设置为当前值,因为线程不同。
现在,如果您想到不同的线程,所有 运行 立即使用 GL,并尝试将相同的上下文设置为当前...不,那行不通。
您可以使用多个上下文,并在 window 创建时 共享 它们。但是 GLFW 很简单,据我所知,您不能为同一个 window.
创建多个上下文
您可以绕过 GLFW 并创建您自己的上下文,与 GLFW 共享...我不知道该怎么做。
您不能将 GLFW 和处理上下文和 windows 与其他库一起使用或单独使用。
重点是共享上下文共享纹理。所以你可以在一个上下文中上传,纹理在所有与这个上下文共享的上下文中都可用。
但是...总有一个 "but"...当前的大多数显卡在使用多个上下文时都没有表现出性能。只有少数允许同时在多个上下文中上传,或者同时阅读和绘图。所以,多上下文优势不是很大。
您在多线程应用程序中可以做的是在专用线程中将每个图像从磁盘读取到 RAM。并在准备就绪时将其传递给 GPU,仅在主线程中。
在我正在创建的应用程序中,我使用了几个按需加载的纹理。 直到现在我在主进程中创建了它们并且一切正常。 现在我想将它们加载到一个单独的线程中。 所以我用 beginthread 调用加载和绑定纹理的函数 纹理已加载,但 GL 失败并显示 SHADER_ERROR (1282)。 我假设 OpenGL 可能需要一个初始初始化,但我一无所知
我正在用 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 只是日志助手
在使用任何 gl 调用之前,必须将 context 设置为使用这些 gl 调用的线程的当前线程。
对于 GLFW,使用 glfwMakeContextCurrent(GLFWwindow *window)
是的,即使使用相同的 window
值,您也需要设置为当前值,因为线程不同。
现在,如果您想到不同的线程,所有 运行 立即使用 GL,并尝试将相同的上下文设置为当前...不,那行不通。
您可以使用多个上下文,并在 window 创建时 共享 它们。但是 GLFW 很简单,据我所知,您不能为同一个 window.
创建多个上下文您可以绕过 GLFW 并创建您自己的上下文,与 GLFW 共享...我不知道该怎么做。
您不能将 GLFW 和处理上下文和 windows 与其他库一起使用或单独使用。
重点是共享上下文共享纹理。所以你可以在一个上下文中上传,纹理在所有与这个上下文共享的上下文中都可用。
但是...总有一个 "but"...当前的大多数显卡在使用多个上下文时都没有表现出性能。只有少数允许同时在多个上下文中上传,或者同时阅读和绘图。所以,多上下文优势不是很大。
您在多线程应用程序中可以做的是在专用线程中将每个图像从磁盘读取到 RAM。并在准备就绪时将其传递给 GPU,仅在主线程中。