这个系列文章我们来介绍一位海外工程师如何探索 OpenGL 音视频渲染技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,这是第 2 篇:OpenGL 创建窗口。
—— 来自公众号关键帧Keyframe的分享
在开始创建令人惊叹的图形之前,我们首先需要创建一个 OpenGL 上下文和一个应用程序窗口来绘制图形。然而,这些操作是特定于操作系统的,而 OpenGL 有意将自己从这些操作中抽象出来。这意味着我们必须自己创建窗口、定义上下文以及处理用户输入。
幸运的是,有许多库可以提供我们所需的功能,其中一些专门针对 OpenGL。这些库为我们节省了所有特定于操作系统的繁琐工作,并为我们提供了一个可以渲染图形的窗口和 OpenGL 上下文。一些更流行的库包括 GLUT、SDL、SFML 和 GLFW。在 LearnOpenGL 中,我们将使用 GLFW。你可以随意选择其他库,大多数库的设置与 GLFW 的设置类似。
在开始创建令人惊叹的图形之前,我们首先需要创建一个 OpenGL 上下文和一个应用程序窗口来绘制图形。然而,这些操作是特定于操作系统的,而 OpenGL 有意将自己从这些操作中抽象出来。这意味着我们必须自己创建窗口、定义上下文以及处理用户输入。
幸运的是,有许多库可以提供我们所需的功能,其中一些专门针对 OpenGL。这些库为我们节省了所有特定于操作系统的繁琐工作,并为我们提供了一个可以渲染图形的窗口和 OpenGL 上下文。一些更流行的库包括 GLUT、SDL、SFML 和 GLFW。在 LearnOpenGL 中,我们将使用 GLFW。你可以随意选择其他库,大多数库的设置与 GLFW 的设置类似。
1、GLFW
GLFW 是一个专门针对 OpenGL 的 C 语言库。GLFW 为我们提供了在屏幕上渲染图形所需的基本功能。它允许我们创建一个 OpenGL 上下文、定义窗口参数以及处理用户输入,这些功能足以满足我们的需求。
本章和下一章的重点是让 GLFW 正常运行,确保它能够正确创建一个 OpenGL 上下文,并为我们显示一个简单的窗口供我们实验。本章采用逐步方法来获取、构建和链接 GLFW 库。我们将使用 Microsoft Visual Studio 2019 IDE(请注意,该过程在较新的 Visual Studio 版本中是相同的)。如果你没有使用 Visual Studio(或使用较旧版本)不要担心,大多数其他 IDE 的过程是相似的。
2、构建 GLFW
可以从 GLFW 网站的下载页面获取 GLFW。GLFW 已经为 Visual Studio 2012 到 2019 提供了预编译的二进制文件和头文件,但为了完整性,我们将从源代码自行编译 GLFW。这是为了让你了解自行编译开源库的过程,因为并非每个库都会提供预编译的二进制文件。因此,让我们下载源代码包。
我们将构建所有库为 64 位二进制文件,因此如果你使用它们的预编译二进制文件,请确保获取 64 位二进制文件。
下载源代码包后,解压它并查看其内容。我们只对以下几项感兴趣:
- 编译后生成的库。
- include文件夹。
从源代码编译库可以确保生成的库完全适合你的 CPU/OS,而预编译的二进制文件并不总是能提供这种优势。然而,向全世界提供源代码的问题在于,并非每个人都使用相同的 IDE 或构建系统来开发应用程序,这意味着提供的项目/解决方案文件可能与其他人的设置不兼容。因此,人们不得不使用给定的 .c/.cpp 和 .h/.hpp 文件设置自己的项目/解决方案,这很麻烦。正是出于这些原因,有一个名为 CMake的工具。
2.1、CMake
CMake 是一个可以从一组源代码文件(使用预定义的 CMake 脚本)生成用户选择的项目/解决方案文件的工具。这允许我们从 GLFW 的源代码包生成一个 Visual Studio 2019 项目文件,用于编译库。首先,我们需要下载并安装 CMake,可以在其下载页面下载。
安装 CMake 后,你可以选择从命令行运行 CMake 或通过其 GUI 运行。为了不复杂化事情,我们将使用 GUI。CMake 需要一个源代码文件夹和一个二进制文件的目标文件夹。对于源代码文件夹,我们将选择下载的 GLFW 源代码包的根文件夹,对于构建文件夹,我们创建一个名为 build的新目录,然后选择该目录。

设置好源代码和目标文件夹后,点击 Configure按钮,让 CMake 读取所需的设置和源代码。然后我们需要选择项目的生成器,因为我们使用的是 Visual Studio 2019,我们将选择 Visual Studio 16选项(Visual Studio 2019 也被称为 Visual Studio 16)。CMake 将显示可能的构建选项以配置生成的库。我们可以将它们保留为默认值,然后再次点击 Configure以存储设置。一旦设置完成,我们点击 Generate,生成的项目文件将出现在你的 build文件夹中。
2.2、编译
现在可以在 build文件夹中找到一个名为 GLFW.sln的文件,我们用 Visual Studio 2019 打开它。由于 CMake 生成的项目文件已经包含正确的配置设置,我们只需要构建解决方案。CMake 应该已经自动配置了解决方案,使其编译为 64 位库;现在点击“生成解决方案”。这将为我们提供一个编译后的库文件,可以在 build/src/Debug中找到,名为 glfw3.lib。
生成库后,我们需要确保 IDE 知道在哪里找到库和头文件,用于我们的 OpenGL 程序。有两种常见的方法可以做到这一点:
- 找到 IDE/编译器的
/lib和/include文件夹,并将 GLFW 的include文件夹内容添加到 IDE 的/include文件夹中,同样将glfw3.lib添加到 IDE 的/lib文件夹中。这可行,但不是推荐的方法。很难跟踪你的库和头文件,而 IDE/编译器的新安装将导致你必须重新进行这个过程。 - 另一种方法(推荐)是在你选择的位置创建一个新的目录集,包含所有第三方库的头文件/库,你可以从 IDE/编译器中引用这些目录。例如,你可以创建一个包含
Libs和Include文件夹的单一文件夹,用于存储我们所有 OpenGL 项目的库和头文件。现在所有第三方库都组织在一个位置(可以跨多台计算机共享)。然而,每次创建新项目时,你都需要告诉 IDE 在哪里找到这些目录。
一旦所需文件存储在你选择的位置,我们就可以开始创建我们的第一个 OpenGL GLFW 项目。
3、我们的第一个项目
首先,打开 Visual Studio 并创建一个新项目。如果提供了多种选项,请选择 C++,然后选择 Empty Project(不要忘记给你的项目一个合适的名字)。由于我们将在 64 位中进行所有操作,而项目默认为 32 位,我们需要将顶部下拉菜单中的 Debug 旁边的 x86 更改为 x64:

完成后,我们现在有了一个工作区来创建我们的第一个 OpenGL 应用程序!
4、链接
为了让项目使用 GLFW,我们需要将库与项目链接。这可以通过在链接器设置中指定我们想要使用 glfw3.lib来完成,但我们的项目还不知道在哪里找到 glfw3.lib,因为我们把第三方库存储在不同的目录中。因此,我们需要先将此目录添加到项目中。
我们可以告诉 IDE 在需要查找库和头文件时考虑此目录。在解决方案资源管理器中右键单击项目名称,然后转到 VC++ Directories,
如下图所示:

从那里开始,你可以添加自己的目录,让项目知道在哪里搜索。这可以通过手动插入文本或点击相应的字符串并选择 <Edit..>选项来完成。对 Library Directories和 Include Directories都这样做:

在这里,你可以添加任意数量的额外目录,从那时起,IDE 在搜索库和头文件时也会搜索这些目录。一旦 GLFW 的 Include文件夹被包含,你就可以通过包含 <GLFW/..>来找到 GLFW 的所有头文件。库目录也是如此。
由于 VS 现在可以找到所有必要的文件,我们终于可以通过转到 Linker标签和 Input来将 GLFW 链接到项目:

要链接到库,你必须向链接器指定库的名称。由于库的名称是 glfw3.lib,我们将其添加到 Additional Dependencies字段(手动或使用 <Edit..>选项),从那时起,当我们编译时,GLFW 将被链接。除了 GLFW,我们还应该添加一个链接项到 OpenGL 库,但这可能因操作系统而异:
4.1、Windows 上的 OpenGL 库
如果你在 Windows 上,OpenGL 库 opengl32.lib随 Microsoft SDK 提供,默认情况下当你安装 Visual Studio 时会安装它。由于本章使用 VS 编译器且在 Windows 上,我们将 opengl32.lib添加到链接器设置中。注意,64 位版本的 OpenGL 库也叫 opengl32.lib,与 32 位版本同名,这有点不幸。
4.2、Linux 上的 OpenGL 库
在 Linux 系统上,你需要链接到 libGL.so库,方法是向链接器设置中添加 -lGL。如果你找不到库,可能需要安装任何 Mesa、NVidia 或 AMD 开发包。
然后,一旦你将 GLFW 和 OpenGL 库都添加到链接器设置中,你可以按以下方式包含 GLFW 的头文件:
#include <GLFW/glfw3.h>
对于使用 GCC 编译的 Linux 用户,以下命令行选项可能有助于编译项目:-lglfw3 -lGL -lX11 -lpthread -lXrandr -lXi -ldl。如果未正确链接相应的库,将生成许多 未定义引用错误。
这完成了 GLFW 的设置和配置。
5、GLAD
我们还没有完全完成,因为还有一件事需要做。由于 OpenGL 只是一个标准/规范,因此由驱动程序制造商实现规范,以支持特定显卡的驱动程序。由于存在许多不同版本的 OpenGL 驱动程序,大多数函数的位置在编译时是未知的,需要在运行时查询。开发人员的任务是检索他们需要的函数的位置,并将它们存储在函数指针中以供以后使用。检索这些位置是特定于操作系统的。在 Windows 上,它看起来像这样:
// 定义函数的原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到函数并将其分配给函数指针
GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 函数现在可以像平常一样调用
unsigned int buffer;
glGenBuffers(1, &buffer);
如你所见,代码看起来很复杂,而且为每个尚未声明的函数执行此操作是一个繁琐的过程。幸运的是,还有为此目的的库,其中 GLAD是一个流行且最新的库。
5.1、设置 GLAD
GLAD 是一个开源库,管理我们之前讨论的所有繁琐工作。GLAD 的配置设置与大多数常见的开源库略有不同。GLAD 使用一个网络服务,我们可以在其中告诉 GLAD 为哪个版本的 OpenGL 定义和加载所有相关的 OpenGL 函数。
前往 GLAD 网络服务,确保语言设置为 C++,在 API 部分选择至少 3.3 版本的 OpenGL(这就是我们将要使用的版本;更高版本也可以)。还要确保将配置文件设置为 Core,并勾选 Generate a loader选项。暂时忽略扩展,然后点击 Generate以生成结果库文件。
确保你使用的是来自 https://glad.dav1d.de/ 的 GLAD1 版本,如上所述。还有一个 GLAD2 版本,但这里无法编译。
GLAD 现在应该为你提供一个包含两个 include 文件夹和一个 glad.c文件的 zip 文件。将两个 include 文件夹(glad和 KHR)复制到你的 include 目录(或添加一个指向这些文件夹的额外项),并将 glad.c文件添加到你的项目中。
完成上述步骤后,你应该能够在文件上方添加以下 include 指令:
#include <glad/glad.h>
点击编译按钮不应该出现任何错误,此时我们已经准备好进入下一章,讨论如何实际使用 GLFW 和 GLAD 来配置一个 OpenGL 上下文并创建一个窗口。请确保检查所有 include 和库目录是否正确,并且链接器设置中的库名称与相应的库匹配。
音视频方向学习、求职,欢迎加入我们的星球
丰富的音视频知识、面试题、技术方案干货分享,还可以进行面试辅导

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。