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

时间:2020-01-23 13:50:23

标签: 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);
}

1 个答案:

答案 0 :(得分:3)

必须先初始化OpenGL,然后才能调用任何OpenGL函数。 (更准确地说:您需要“使OpenGL上下文成为当前环境”)

具体操作方式取决于所使用的库。

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

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