将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃

  • 本文关键字:对象 崩溃 静态 创建 全局 c++
  • 更新时间 :
  • 英文 :


我为 OpenGL 纹理创建了一个类,对于某些应用程序,静态对象会很有用。 问题是,当我将纹理创建为静态或全局对象时,我的程序崩溃,而作为本地对象,一切正常。我完全不知道发生了什么。

这是我的构造函数:

Texture::Texture(std::string file, bool bitmap):
textureName("tex"), transparent(false) {
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
int texWidth, texHeight;
unsigned char *data = SOIL_load_image(file.c_str(), &texWidth, &texHeight, 0, SOIL_LOAD_RGBA);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
if(bitmap) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glGenerateMipmap(GL_TEXTURE_2D);
}
else {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
glBindTexture(GL_TEXTURE_2D, 0);
for(int i = 3; i < texWidth * texHeight * 4; i+= 4) {
if(data[i] != 0xff) {
transparent = true;
break;
}
}
textureSize = glm::vec2(texWidth, texHeight);
SOIL_free_image_data(data);
}

OpenGL 必须先初始化,然后才能调用任何 OpenGL 函数。(更准确地说:你需要"使OpenGL上下文成为当前内容"(

执行此操作的方式取决于您使用的库。

所有库都有一个共同点:您需要调用一些函数,您通常在main中调用这些函数。(例如,GLFW 中的glfwCreateWindowglfwMakeContextCurrent(

由于全局对象是在调用main之前创建的,因此您尝试在拥有 OpenGL 上下文之前调用 OpenGL 函数。这行不通。

最新更新