我安装了OpenGL版本4.4,相应的4.4核心GLAD构建和GLFW版本3.2(在Visual Studio 2015中编辑)。我正在使用https://learnopengl.com/#!In-Practice/Debugging中详述的回调函数:

void APIENTRY glDebugOutput(GLenum source, GLenum type, GLuint id, GLenum severity,
    GLsizei length, const GLchar *message, const void *userParam);

我有以下功能:
GLFWwindow* init(int width, int height, const char* header) {
    GLFWwindow* window;

    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);

    window = glfwCreateWindow(width, height, header, NULL, NULL);
    if (window == NULL) {
        glfwTerminate();
        throw std::runtime_error("Failed to create GLFW window.");
    }
    glfwMakeContextCurrent(window);
    glfwSetFramebufferSizeCallback(window, resizeCallback);

    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        glfwTerminate();
        throw std::runtime_error("Failed to initialize GLAD");
    }

    GLint flags; glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
    if (flags & GL_CONTEXT_FLAG_DEBUG_BIT)
    {
        glEnable(GL_DEBUG_OUTPUT);
        glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
        glDebugMessageCallback(glDebugOutput, nullptr); // segfault on this line
        glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
    }

    return window;
}

我尝试重新安装GLAD并将APIENTRY更改为CALLBACK,但无济于事。我完全迷路了,有什么建议吗?

最佳答案

您在这里的要求:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

是GL 3.3核心。遵循relevant extension规范:



您可能会得到> = 3.3的上下文。您具有支持GL 4.4的OpenGL实现的事实并不能保证您获得4.4上下文。您可能会得到-如今实际上有很多驱动程序都可以实现-正是您所要求的版本。

如果您查看GLAD中的代码,则会发现:
static void load_GL_VERSION_4_3(GLADloadproc load) {
        if(!GLAD_GL_VERSION_4_3) return;
        [...]
        glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)load("glDebugMessageCallback");
        [...]
}

因此,如果上下文的GL版本至少为4.3,则GLAD甚至不会尝试加载该函数指针。结果,在不确保您处于> = 4.3上下文的情况下调用此函数只是未定义的行为,很有可能发生崩溃。

07-22 03:31