user11914177
user11914177

Reputation: 965

Creating objects as global / static object crashes, while a local object doesn't

I created a class for OpenGL textures and for some applications, a static object would be useful. The problem is, when I create a texture as static or global object, my program crashes, while as local object, everything works fine. I have absolutely no idea what is going on.

This is my constructor:

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);
}

Upvotes: 0

Views: 55

Answers (1)

OpenGL must be initialized before you can call any OpenGL functions. (More accurately: you need to have "made an OpenGL context current")

The way you do that depends on which libraries you are using.

One thing that all the libraries have in common is: there are some functions you need to call, which you usually call in main. (for example, glfwCreateWindow and glfwMakeContextCurrent in GLFW)

Since global objects are created before main is called, you are trying to call OpenGL functions before you have an OpenGL context. This doesn't work.

Upvotes: 3

Related Questions