LearnOpenGL学习笔记(一):在Xcode下搭建GLEW、GLFW及GLAD环境
LearnOpenGL学习笔记(一)
1.环境配置
系统是macOS,在Xcode下搭建GLEW、GLFW及GLAD的环境。
1.1 安装GLEW与GLFW
在终端中通过brew安装GLEW与GLFW:
brew install glew
brew install glfw3
1.2 下载GRAD
打开GLAD的在线服务,将语言(Language)设置为C/C++,在API选项中,选择3.3以上的OpenGL(gl)版本。之后将模式(Profile)设置为Core,并且保证生成加载器(Generate a loader)的选项是选中的。都选择完之后,点击生成(Generate)按钮来生成库文件。
1.3 创建工程
新建Command Line Tool项目,语言选择C++
上一步GLAD现在应该提供给你了一个glad.zip压缩文件,包含两个头文件目录,和一个glad.c文件。
将两个头文件目录(glad和KHR,注意是两个文件夹不是.h文件)复制到/usr/local/include文件夹中
并添加glad.c文件到工程中
如下图所示:
1.4 配置工程
在工程的Building Settings – Search Paths – Header Search Paths
添加下面四个路径到Header Search Paths
/usr/local/include
$(inherited)
/usr/local/Cellar/glfw/3.3.0/lib
/usr/local/Cellar/gl2w/2.3.0/lib
这里面版本号要根据你安装的版本做相应的修改
查看路径:/usr/local/Cellar/glfw/ 和 /usr/local/Cellar/glew/
然后在工程的 General – Linked Frameworks and Libraries添加如下两个包:
注意在它提供给你的目录里是找不到的。要到“Add other…”里按shift+command+G 快捷键进到/usr/local/Cellar/glfw/3.3.0/lib 以及 /usr/local/Cellar/glew/2.2.0/lib 目录选中这两个包
2.测试程序
大功告成,可以根据教程写一个程序进行测试,代码如下:
main.cpp
//注意要在包含GLFW的头文件之前包含了GLAD的头文件! #include <glad/glad.h> #include <GLFW/glfw3.h> #include <iostream> using namespace std; //当用户改变窗口的大小的时候,视口也应该被调整,需要一个回调函数 void framebuffer_size_callback(GLFWwindow * window,int width,int height); //声明一个函数用来检测特定的键是否被按下 void processInput(GLFWwindow * window); int main(){ //初始化GLFW glfwInit(); //将OpenGL主版本号(Major)和次版本号(Minor)都设为3 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //使用的是核心模式(Core-profile) glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //如果是macOS系统,则需要下面这行代码才能让配置起作用 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //创建一个窗口对象 GLFWwindow * window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL); if (window == NULL){ cout << "Failed to create GLFW window" << endl; glfwTerminate(); return -1; } //通知GLFW将我们窗口的上下文设置为当前线程的主上下文 glfwMakeContextCurrent(window); //GLAD是用来管理OpenGL的函数指针的,在调用任何OpenGL的函数之前我们需要初始化GLAD if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){ cout << "Failed to initialize GLAD" << endl; return -1; } //注册定义好的回调函数,告诉GLFW每当窗口调整大小的时候调用这个函数 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); //渲染循环(Render Loop) while (!glfwWindowShouldClose(window)) { //检测特定的键是否被按下,并在每一帧做出处理 processInput(window); //glClearColor函数是一个状态设置函数,用来设置清空屏幕所用的颜色 glClearColor(0.2f,0.3f,0.3f,1.0f); //glClear函数是一个状态使用函数,它使用当前的状态来用指定颜色清空屏幕 glClear(GL_COLOR_BUFFER_BIT); //glfwSwapBuffers函数会交换颜色缓冲 glfwSwapBuffers(window); //glfwPollEvents函数检查有没有触发什么事件 glfwPollEvents(); } //释放之前分配的所有资源 glfwTerminate(); return 0; } void framebuffer_size_callback(GLFWwindow * window,int width,int height){ //glViewport函数前两个参数控制窗口左下角的位置,第三个和第四个参数控制渲染窗口的宽度和高度 glViewport(0,0,width,height); } void processInput(GLFWwindow * window){ //检查用户是否按下了返回键(Esc)(如果没有按下,glfwGetKey将会返回GLFW_RELEASE,按下则为GLFW_PRESS) if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { glfwSetWindowShouldClose(window, true); } }
输出如下:
键盘输入esc键可退出
2.1 如果遇到如下错误:
解决方案: