gpt4 book ai didi

c++ - glDebugMessageCallback 导致访问冲突(GLFW + GLAD)

转载 作者:行者123 更新时间:2023-11-30 01:38:23 28 4
gpt4 key购买 nike

我安装了 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规范:

If version 3.2 or greater is requested, the context returned may implement any of the following versions:

  • The requested profile of the requested version.
  • The requested profile of any later version, so long as no features have been removed from that later version and profile.

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

关于c++ - glDebugMessageCallback 导致访问冲突(GLFW + GLAD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48026620/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com