Search code examples
c++openglglfwglad

Segmentation Fault when using some OpenGL functions


I am having troubles using OpenGL functions in my render loop.
Here is my code :

// This works, I have glad in an include folder with glad headers in it
#include "include/glad/glad.h" 
#include <GLFW/glfw3.h>
#include <iostream>


int main(int argc, char *argv[])
{
    if (!glfwInit())
    {
        std::cerr << "Failed to initialise GLFW !" << std::endl;
        return -1;
    }
    glfwSetErrorCallback(callback_error);

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
    GLFWwindow *window = glfwCreateWindow(640, 480, "Block++", NULL, NULL);

    if (!window)
    {
        std::cerr << "Failed to open window" << std::endl;
        return -1;
    }
    glfwMakeContextCurrent(window);

    gladLoadGL();

    // This line works well so I guess the issue is not related to OpenGL imports
    std::cout << "OpenGL version: " << glGetString(GL_VERSION) << std::endl;

    glfwSwapInterval(1);

    glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);

    glClearColor(0.22f, 0.83f, 0.86f, 0.0f);
    camera.setWindowSize(640, 480);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glClearDepth(1.0f);

    //Some initialization stuff here, removing does not impact the result


    // This is the main render loop
    while (!glfwWindowShouldClose(window))
    {
        
        // The error happens here (I saw that using gdb with Visual Studio Code)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        // And it happens here if I remove the glClear line
        glLoadIdentity(); 

        // The actual rendering stuff is never executed because of the error

        glFlush();
        glfwSwapBuffers(window);

        glfwWaitEvents();
        //glfwPollEvents();
    }

    glfwDestroyWindow(window);
    glfwTerminate();
}

And the error message is not very helpful and specific :

OpenGL version: 4.6 (Core Profile) Mesa 21.1.1 // OpenGL seems to be working
[1]    19991 segmentation fault (core dumped)  ./main

The answers I found on StackOverflow and on other websites didn't help me fix my problem as they often refer to GLUT which I was told is out-of-date.


Solution

  • I found two ways to "fix" the issue :

    1. Using the compatibility profile (not recommended but very easy):
    // Replace this
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    // by this
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);
    

    This is not really a fix but it allows the program to run deprecated and removed instructions.

    1. Properly loading GLAD and use modern OpenGL (that's the good way of doing it)
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }
    

    This loads GLAD properly, but the rest of the code has to be refactored to fit modern OpenGL requirements (shaders, etc.).
    I learned a lot about shaders and vertices arrays on this website.