引入GLAD后调用glClear()导致GLFW崩溃问题求助
OpenGL 3.3 Core Profile 初始化异常及glClear崩溃问题
一开始使用GLFW基础示例代码,运行后能正常显示标题为“Hello World”的黑色窗口:
#include <GLFW/glfw3.h> int main(void) { GLFWwindow* window; /* Initialize the library */ if (!glfwInit()) return -1; /* Create a windowed mode window and its OpenGL context */ window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); if (!window) { glfwTerminate(); return -1; } /* Make the window's context current */ glfwMakeContextCurrent(window); /* Loop until the user closes the window */ while (!glfwWindowShouldClose(window)) { /* Render here */ glClear(GL_COLOR_BUFFER_BIT); /* Swap front and back buffers */ glfwSwapBuffers(window); /* Poll for and process events */ glfwPollEvents(); } glfwTerminate(); return 0; }
但进行以下修改后出现一系列问题:
- 添加GLAD头文件(需在GLFW之前引入):
#include <glad/glad.h> #include <GLFW/glfw3.h>
- 设置OpenGL版本与核心配置的窗口提示:
// 指定使用的OpenGL版本 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
此时窗口初始化直接失败,添加苹果平台兼容代码后:
#ifdef __APPLE__ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); #endif
窗口可以正常创建,但调用glClear(GL_COLOR_BUFFER_BIT)时程序崩溃,报错:
'./Voxel Game' terminated by signal SIGSEGV (Address boundary error)
如果移除上述苹果兼容代码,程序能正常运行,但无法执行屏幕清除操作。
当前完整代码如下:
#include <iostream> #include <glad/glad.h> #include <GLFW/glfw3.h> #define SCREEN_WIDTH 640 #define SCREEN_HIEGHT 480 int main() { GLFWwindow* window; // 初始化GLFW库 if (!glfwInit()) { std::cout << "Failed to initalize GLFW" << std::endl; return -1; } // 指定使用的OpenGL版本 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); #ifdef __APPLE__ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); #endif // 创建窗口及OpenGL上下文 window = glfwCreateWindow(SCREEN_WIDTH, SCREEN_HIEGHT, "Voxel Game", NULL, NULL); if (!window) { std::cout << "Failed create GLFW window" << std::endl; glfwTerminate(); return -1; } // 将窗口上下文设为当前 glfwMakeContextCurrent(window); // 窗口循环,直到用户关闭窗口 while (!glfwWindowShouldClose(window)) { // 渲染操作 //glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // 交换前后缓冲区 glfwSwapBuffers(window); // 处理事件 glfwPollEvents(); } glfwTerminate(); return 0; }
内容的提问来源于stack exchange,提问作者Regin.hd
相关产品推荐
相关产品推荐

