【问题标题】:glDebugMessageCallback causing access violation (GLFW + GLAD)glDebugMessageCallback 导致访问冲突(GLFW + GLAD)
【发布时间】:2017-12-29 18:09:45
【问题描述】:

我安装了 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,但无济于事。我完全迷路了,有什么建议吗?

【问题讨论】:

标签: c++ opengl visual-c++ glfw


【解决方案1】:

你在这里要求什么:

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

是 GL 3.3 核心。根据relevantextension规范:

如果请求 3.2 或更高版本,则返回的上下文可能 实现以下任一版本:

  • 请求版本的请求配置文件。
  • 任何更高版本的请求配置文件,只要没有 已从该更高版本和配置文件中删除功能。

您可能会得到一些上下文 >= 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 上下文的情况下调用此函数只是未定义的行为,并且很可能会发生崩溃。

【讨论】:

    猜你喜欢
    • 2021-07-27
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多