我安装了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,但无济于事。我完全迷失了,有什么建议吗?
答案 0 :(得分:3)
您在此处提出的要求:
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.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上下文的情况下调用此函数只是未定义的行为,并且很可能发生崩溃。