Maine

纵有疾风起,人生不言弃

菜鸟 OpenGL 入门 - OpenGL 环境搭建(二)

《菜鸟 OpenGL 入门 – OpenGL 环境搭建(一)》一节,我们使用 Mac 下自带的 GLUT 搭建了基本的 OpenGL 开发环境,你可以使用它,但现在 GLUT 已经过时了,现在我们使用 GLAD 搭配 GLFW 搭建开发环境。

GLFW

因为 OpenGL 只定义了一些图形API,它并没有为我们提供例如创建窗口,处理用户输入之类的操作,我们必须借助一些其他的库来创建窗口。这类的库有好几个可供选择,比如 Qt、GLUT 以及 我们接下来要说的 GLFW,Qt 很不错,但也很庞大,初学 OpenGL 暂时略过,今后有机会会试试 Qt 结合 OpenGL,GLUT 已经过时了,偶尔一用还可以,上一节中我们介绍的环境搭建就是使用 GLUT,不过已经不建议使用了,虽然红宝书还在用。

GLFW 是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,创建窗口以及处理用户输入。顺带一提:GLWF 支持 windows,MacOS 和 Linux。

GLFW 的配置

在 Windows 下,在 GLFW 的下载页 GLFW 可以下载到二进制版本和相应的头文件,据教程上说,64位版本会出现很多奇奇怪怪的问题,要下32位的,当然,你可以下载源码自己编译,并不复杂,需要 CMake。

我们在 Mac 下也可以编译 GLFW,但是,这里我们选择一种更为方便的方式:homebrew。如果你还不会使用 homebrew,请看《Homebrew 简介和基本使用》

安装 glfw:

brew install glfw3

在我们的 C++ 文件中使用,需要引入头文件:

#include <GLFW\glfw3.h>

在 Mac 下如果使用 XCode 需要链接进 OpenGL.frameworklibglfw.dylib。如果使用 g++,则需要指定如下类似如下编译选项:

g++ -framework OpenGL -lGLFW ./main.cpp -o demo

GLFW 的配置暂且为止。

GLAD

因为 OpenGL 只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。在C/C++程序中使用 OpenGL 时,可以使用 glew/glad 这样的第三方库来加载OpenGL 函数。举个例子,在 windows 下,如果没有使用 glew/glad这样的库,在 Windows 下调用一个 OpenGL 函数的方法如下:

// 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers  = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 现在函数可以被正常调用了
GLuint buffer;
glGenBuffers(1, &buffer);

代码好复杂哎,你想天天写这样的代码吗?好在有 glew/glad这样的库帮我们,以往很多使用 glew 库,现在 glad 是最新、最流行的库。

配置 GLAD

GLAD 的配置与以往那些库有很大不一样,它使用一个在线服务,我们可以在这里根据需要定义的OpenGL版本,并且根据这个版本加载所有相关的OpenGL函数。

打开GLAD在线服务,将语言(Language)设置为C/C++,在API选项中,选择 3.3 以上的OpenGL(gl)版本,我的 Mac 使用的 OpenGL 最高是 4.1,之后将模式(Profile)设置为 Core。并且勾选 Generate a loader 选项。最后点击生成按钮。

GLAD 给了你一个 zip 压缩包,解压后有 include 文件夹,里面有 gladKHR 文件夹;还有一个 src 目录,里面有 glad.c,要使用 glad 则需要:

  1. include 文件下的两个目录复制到系统 include 目录下,比如,在 Mac 下就是 /usr/local/include/ 目录。
  2. src 目录下的 glad.c 添加到你的工程当中去。
  3. 在你的代码中引入 glad 的头文件: #include <glad/glad.h>

你可以尝试编译一下,看看有没有什么错误,一切 OK 就可以开始着手学习 OpenGL 了。!

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注