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)按钮来生成库文件。
GLAD现在应该提供给你了一个zip压缩文件,包含两个头文件目录,和一个glad.c文件。将两个头文件目录(glad和KHR,注意是两个文件夹不是.h文件)复制到/usr/local/include文件夹中,并添加glad.c文件到工程中,如下图所示:
1.3 配置工程
在工程的Building Settings – Search Paths – Header Search Paths
添加下面四个路径到Header Search Paths
/usr/local/include
$(inherited)
/usr/local/Cellar/glfw/3.2.1/lib
/usr/local/Cellar/gl2w/2.1.0/lib
这里面版本号要根据你安装的版本做相应的修改,如下图所示:
然后在工程的 General – Linked Frameworks and Libraries添加如下两个包:
注意在它提供给你的目录里是找不到的。要到“Add other…”里按shift+command+G 快捷键进到/usr/local/Cellar/glfw/3.2.1/lib 以及 /usr/local/Cellar/glew/2.1.0/lib 目录选中这两个包
2.测试程序
大功告成,可以根据教程写一个程序进行测试,代码如下:
//注意要在包含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键可退出