首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导致访问冲突的glDebugMessageCallback (GLFW + GLAD)

导致访问冲突的glDebugMessageCallback (GLFW + GLAD)
EN

Stack Overflow用户
提问于 2017-12-29 18:09:45
回答 1查看 2.5K关注 0票数 1

我已经安装了OpenGL版本4.4,相应的4.4内核高兴构建,以及GLFW版本3.2 (在Visual 2015中编辑)。我正在使用回调函数,详见https://learnopengl.com/#!In-Practice/Debugging

代码语言:javascript
复制
void APIENTRY glDebugOutput(GLenum source, GLenum type, GLuint id, GLenum severity, 
    GLsizei length, const GLchar *message, const void *userParam);

我的职能如下:

代码语言:javascript
复制
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;
}

我试着重新安装高兴和更改APIENTRY回拨,但没有任何效果。我完全迷路了,有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-29 18:37:55

你在这里要求的是:

代码语言:javascript
复制
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

是GL 3.3核心。根据相关 扩展规范:

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

  • 所请求的版本的概要文件。
  • 任何较后版本的所请求的概要文件,只要没有从该后续版本和概要文件中删除任何功能。

您可能会得到一些上下文>= 3.3。事实上,您有一个能够实现GL4.4的OpenGL实现,这并不能保证您得到了一个4.4上下文。YOu可能会得到--现在很多司机都会这么做--这正是你想要的版本。

如果您查看愉快的代码,您会发现:

代码语言:javascript
复制
static void load_GL_VERSION_4_3(GLADloadproc load) {
        if(!GLAD_GL_VERSION_4_3) return;
        [...]
        glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)load("glDebugMessageCallback");
        [...]
}

因此,如果上下文的GL版本至少不是4.3,那么高兴甚至不会尝试加载该函数指针。因此,调用此函数而不确保您所处的是>= 4.3上下文,这只是未定义的行为,而且很可能会发生崩溃。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48026620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档