03HelloWindow

Hello,Window#

我们来看看能不能让 GLFW 运行起来。首先,创建一个 .cpp 文件,并在新创建的文件顶部添加以下包含语句。

#include <glad/glad.h>
#include <GLFW/glfw3.h>

请务必在引入 GLFW 之前引入 GLAD。GLAD 的头文件包含了后台所需的 OpenGL 头文件(例如 GL/gl.h ),因此请确保在其他需要 OpenGL 的头文件(例如 GLFW)之前引入 GLAD。

接下来,我们创建主函数,并在其中实例化 GLFW 窗口:

int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
  
    return 0;
}

在主函数中,我们首先使用 `glfwInit` 初始化 GLFW,之后可以使用 `glfwWindowHint` 配置 GLFW。`glfwWindowHint` 的第一个参数指定要配置的选项,我们可以从一个以 GLFW_ 为前缀的枚举列表中选择。第二个参数是一个整数,用于设置选项的值。所有可用选项及其对应值的列表可以在 GLFW 的窗口处理文档中找到。如果您现在尝试运行应用程序并出现大量_未定义引用_错误,则表示您没有成功链接 GLFW 库。

由于本书重点介绍 OpenGL 3.3 版本,我们需要告知 GLFW 我们要使用的 OpenGL 版本为 3.3。这样,GLFW 在创建 OpenGL 上下文时就能做出正确的配置。这确保了当用户没有安装正确的 OpenGL 版本时,GLFW 不会运行。我们将主版本号和次版本号都设置为 3 此外,我们还告知 GLFW 我们要==显式使用核心配置文件。使用核心配置文件意味着我们将获得 OpenGL 功能的一个较小子集,而不会使用我们不再需要的向后兼容功能。==请注意,在 macOS 系统上,您需要在初始化代码中添加 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 才能使其生效。

02创建窗口

在开始创建精美图形之前,我们需要做的第一件事是创建一个 OpenGL 上下文和一个用于绘制的应用程序窗口。然而,这些操作因操作系统而异,OpenGL 也刻意将这些操作抽象化。这意味着我们需要自行创建窗口、定义上下文并处理用户输入

幸运的是,有很多库可以提供我们所需的功能,其中一些是专门针对 OpenGL 的。这些库省去了我们所有与操作系统相关的繁琐工作,并为我们提供了一个窗口和一个 OpenGL 上下文来进行渲染。一些比较流行的库包括 GLUT、SDL、SFML 和 GLFW。在 LearnOpenGL 课程中,我们将使用 GLFW 。当然,您也可以使用其他任何库,大多数库的设置都与 GLFW 的设置类似。

GLFW#

GLFW 是一个用 C 语言编写的库,专门针对 OpenGL。GLFW 提供了在屏幕上渲染内容所需的基本功能。它允许我们创建 OpenGL 上下文、定义窗口参数并处理用户输入,这些功能足以满足我们的需求。

本章及下一章的重点是启动并运行 GLFW,确保它能正确创建 OpenGL 上下文,并显示一个简单的窗口供我们进行实验。本章将采用循序渐进的方式,讲解如何获取、构建和链接 GLFW 库。截至本文撰写之时,我们将使用 Microsoft Visual Studio 2019 IDE(请注意,在更新的 Visual Studio 版本中,此过程相同)。如果您未使用 Visual Studio(或更早的版本),也无需担心,在大多数其他 IDE 中,此过程也类似。

建造 GLFW#

您可以从 GLFW 的网页 下载页面获取它。GLFW 已经提供了适用于 Visual Studio 2012 到 2019 的预编译二进制文件和头文件,但为了完整起见,我们将从源代码自行编译 GLFW。这样做是为了让您体验自行编译开源库的过程,因为并非所有库都有预编译的二进制文件。那么,让我们下载_源代码包_吧。

我们将把所有库都构建成 64 位二进制文件,因此如果您使用的是预编译的二进制文件,请确保获取 64 位二进制文件。

下载完源代码包后,请解压缩并打开其内容。我们只需要其中的几个项目:

  • 编译后生成的库。
  • include文件夹。

从源代码编译库可以确保生成的库完美适配您的 CPU/操作系统,这是预编译二进制文件并不总是能提供的(有时,您的系统甚至没有可用的预编译二进制文件)。然而,向开源社区提供源代码的问题在于,并非所有人都使用相同的 IDE 或构建系统来开发应用程序,这意味着提供的项目/解决方案文件可能与其他人的配置不兼容。因此,其他人必须使用提供的 .c/.cpp 和 .h/.hpp 文件来配置自己的项目/解决方案,这非常繁琐。正是出于这些原因,才有了 CMake 这个工具

01OpenGL

在开始我们的探索之旅前,我们首先应该明确 OpenGL 究竟是什么。OpenGL 主要被视为一个 API(应用程序编程接口),它提供了一系列可用于操作图形和图像的函数。然而,OpenGL 本身并非 API,而仅仅是一个规范,由 Khronos Group 开发和维护。

OpenGL 规范明确规定了每个函数的输出结果及其执行方式。开发者需要根据规范 实现 这些函数,并找到相应的解决方案。由于 OpenGL 规范并未提供具体的实现细节,因此实际开发的 OpenGL 版本可以采用不同的实现方式,只要其结果符合规范(从而对用户而言相同)即可。

实际开发 OpenGL 库的是显卡制造商。你购买的每张显卡都支持特定版本的 OpenGL,这些版本是专门为该显卡(系列)开发的。在苹果系统中,OpenGL 库由苹果公司维护;而在 Linux 系统中,则存在着显卡供应商提供的版本以及爱好者对这些库的修改版本。这也意味着,如果 OpenGL 出现任何异常行为,很可能是显卡制造商(或开发/维护该库的人员)的问题。

由于大多数 OpenGL 实现都是由显卡制造商开发的,因此一旦实现中出现错误,通常可以通过更新显卡驱动程序来解决;这些驱动程序包含显卡支持的最新 OpenGL 版本。这也是为什么始终建议定期更新显卡驱动程序的原因之一。

Khronos 公开托管了所有 OpenGL 版本的规范文档。感兴趣的读者可以 在这里找到 OpenGL 3.3 版本的规范(我们将使用这个版本),如果您想深入了解 OpenGL 的细节,这份规范值得一读(请注意,其中大部分内容仅描述结果,而非具体实现)。这些规范也为理解其函数的具体工作原理提供了极佳的参考。

核心模式与即时模式#

过去,使用 OpenGL 意味着在即时模式(通常称为固定功能管线)下进行开发,这是一种易于使用的图形绘制方法。OpenGL 的大部分功能都隐藏在库内部,开发者对 OpenGL 的计算方式几乎没有控制权。随着开发者对灵活性的需求不断增长,规范也随之变得更加灵活,开发者获得了对图形的更多控制权。即时模式虽然易于使用和理解,但效率极低。因此,从 3.2 版本开始,规范逐渐弃用即时模式的功能,并鼓励开发者使用 OpenGL 的核心配置文件模式进行开发。核心配置文件模式是 OpenGL 规范的一个分支,它移除了所有旧的、已弃用的功能。

使用 OpenGL 的核心配置文件时,OpenGL 会强制我们使用现代编程实践。每当我们尝试使用 OpenGL 已弃用的函数时,OpenGL 都会抛出错误并停止绘制。学习现代方法的优势在于其灵活性和高效性。然而,它也更难学习。立即模式抽象了 OpenGL 执行的许多 实际操作,虽然易于学习,但很难理解 OpenGL 的实际运行机制。现代方法要求开发者真正理解 OpenGL 和图形编程,虽然这有点难度,但它提供了更大的灵活性、更高的效率,最重要的是:更深入地理解图形编程。

这也是本书以核心配置文件 OpenGL 3.3 版本为目标的原因。虽然难度更高,但绝对值得付出努力。

00介绍

欢迎来到这本在线 OpenGL 学习书籍!无论您学习 OpenGL 的目的是学术研究、职业发展还是纯粹出于兴趣爱好,本书都将使用 现代 (核心配置文件)OpenGL,为您讲解 OpenGL 的基础知识、中级知识以及所有高级知识。本书旨在以清晰易懂的方式和示例,向您展示现代 OpenGL 的方方面面,同时为后续学习提供有用的参考资料。

那么,为什么要读这些章节呢?#

互联网上有成千上万篇关于学习 OpenGL 的文档、书籍和资源,然而,其中大多数资源只关注 OpenGL 的即时模式(通常被称为旧版 OpenGL),内容不完整,缺乏完善的文档,或者不符合你的学习偏好。因此,我的目标是提供一个既完整又易于理解的平台。

如果您喜欢阅读提供循序渐进的指导、清晰示例且不会让您被海量细节淹没的内容,那么这本书可能正合您意。本书各章节旨在让没有任何图形编程经验的读者也能理解,同时也能为经验丰富的用户带来阅读乐趣。我们还会探讨一些实用的概念,只需稍加创意,就能将您的想法转化为真正的 3D 应用。如果您觉得以上描述与您自身情况相符,那么请继续阅读。

你将学到什么?#

这些章节的重点是现代 OpenGL学习(和使用)现代 OpenGL 需要扎实的图形编程知识,以及对 OpenGL 底层工作原理的了解,才能真正获得最佳体验。因此,我们将首先讨论核心图形方面的内容,即 OpenGL 如何将像素绘制到屏幕上,以及如何利用这些知识来创建一些炫酷的效果

除了核心知识之外,我们还将探讨许多可用于应用程序的实用技巧,例如:场景遍历、创建精美光照、从建模程序加载自定义对象、进行炫酷的后期处理等等。我们还会推出一系列演示视频,实际创建一个基于所学 OpenGL 知识的小游戏,让您真正体验图形编程的乐趣。

从哪里开始呢?#

学习 OpenGL 完全免费,而且永远免费,任何想要入门图形编程的人都可以使用。所有内容都可以在左侧菜单中找到。只需点击“简介”按钮,即可开始您的学习之旅!