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

标签 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函数。这行不通。

关于c++ - 当全局/静态对象崩溃时创建对象,而本地对象则不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59880156/

相关文章:

c++ -/usr/bin/ld : cannot find -lgd

c++ - 如何在C#中创建和使用dll文件

c++ - 循环遍历 Lua 表格中的表格

c++ - 函数调用顺序

c++ - 在 Grpc 中使用双向流时如何检测(物理)断开连接

c++ - 自定义列表小部件

c++ - 如何根据物体位置和速度、玩家位置和前向 vector 计算左耳和右耳的音量? (3D 声音)

c++ - 将英镑转换为欧元 - 使用参数

c++ - 从多级 unordered_map 中删除元素?

c++ - 使用 std::shared_ptr 时出现 malloc 错误