在之前一片文章中学习了使用标准的OpenGL接口创建一个OpenGL的hello world。这篇文章主要是学习如何使用OpenGL强大的第三方支持库来创建程序。
一、安装GLFW、GLEW、GLAD第三方支持库
1. 安装brew
2. 用brew安装glfw和glew
brew install glfw3
brew install glew
brew link glfw3
brew link glew
3. 安装并link成功后,库的头文件安装到 /usr/local/Cellar/glfw/ 和 /usr/local/Cellar/glew/ 目录,同时link到了 /usr/local/include 目录下。
4. 安装glad依赖
因为OpenGL只是一个标准/规范,具体的实现还是由驱动开发商针对特性显卡实现的。由于OpenGL驱动版本众多,它的大多数函数的位置都无法再编译时确定下来,需要在运行时查询,所以这部分内容就需要开发者来配置。开发者需要在运行时获取函数的地址,并将其保存在一个函数指针中供以后使用。取得地址的方法也因为平台而不同,例如在window上可能是这样的:
// 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 现在函数可以被正常调用了
GLuint buffer;
glGenBuffers(1, &buffer);
过程相对是很复杂的,但是,glad开源库可以解决这个问题。
打开GLAD在线服务https://glad.dav1d.de/,将语言设置为c++,选择gl API版本为3.3,修改profile为core。点击“GENERATE”,GLAD在线服务会帮你生成一个glad.zip包。将其下载下来,解压,将include目录中的glad和KHR目录复制到你的include目录:
cd glad
cp -r KHR /usr/local/include
cp -r glad /usr/local/include
4. 在xcode中配置 Custom Paths
xcode -> Preference -> Locations -> Custom Paths,点下方+号添加路径:
5. 在xcode中创建一个mac command line tool项目,
在Bulid Settings的Header Search Paths里面点击+号添加以下两项配置:
/usr/local/include
$(glew_header) $(glfw_header)
在Library Search Paths配置:
$(glew_lib) $(glfw_lib)
6. 在Build Phases->Linked Frameworks and libraries 添加
- OpenGL.framework
- GLUT.framework
- libGLEW.2.1.0.dylib
- libglfw3.3.2.dylib
后面那两个库在Xcode中找不到,点击Finder右键前往文件夹到/usr/local/Cellar/下面的两个安装包的lib下面找到我们要的文件
二、使用第三方支持库GLFW框架创建一个OpenGL窗口
打开上面配置好的,之前创建的 mac command line tool项目,在main.cpp文件中添加以下代码,command B编译,command R运行,看到一个黑色的窗口弹出,表示第三方支持库配置成功。
#include <iostream>
// #include <GL/glew.h>
#include <glad/glad.h> // glad与glew二选一
#include <GLFW/glfw3.h>
int main(int argc, const char * argv[]) {
GLFWwindow* window;
if (!glfwInit())
return -1;
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// glad: load all OpenGL function pointers
// ---------------------------------------
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
while (!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}