glDebugMessageCallback 导致访问冲突 (GLFW + GLAD)
glDebugMessageCallback causing access violation (GLFW + GLAD)
我安装了OpenGL版本4.4,相应的4.4核心GLADE版本和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 核心。符合相关扩展规范:
如果请求版本 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 上下文的情况下调用此函数只是未定义的行为,并且很可能崩溃。
相关文章:
- Windows.h与GLFW.h的接口
- 无法将 GLFW 库与 Ubuntu 18.04 上的头文件链接
- glad 导致 glfwSwapBuffers 返回错误消息
- 如何获取 GLFW 窗口 ID?
- GLFW需要链接什么?
- 如何在OpenGL(GLFW,很高兴)中进行2D缩放?
- 为什么需要检查 GLAD 或 GLEW 是否正确初始化?
- GLFW glfwCreateWindowSurface return -7
- GLFW DDS 加载函数的 OpenGL 链路错误
- 在 GLFW 窗口中显示 FFMPEG 解码帧
- GLFW 切换布尔切换
- 同时使用Opengl CORE函数以及Comptability Profile - GLFW
- 对GLFW / Vulkan的未定义引用,尽管库似乎是链接的
- 无法让 cmake 链接到 GLFW 库
- 关于 Vulkan 并使用 GLFW 抽象出 Surface 创建
- 编译器无法链接/查找 GLFW
- glfw 的基本设置会导致与 emscripten 生成的 js 文件中的事件侦听器有关的运行时错误
- OpenGL GLFW GLAD 在项目之间共享 Visual C++.
- OpenGL, GLFW, GLAD. glViewport(0, 0, 800, 600) 抛出内存错误
- glDebugMessageCallback 导致访问冲突 (GLFW + GLAD)