Skip to content

Commit

Permalink
Update 02 Creating a window.md
Browse files Browse the repository at this point in the history
更新至于原文同步
  • Loading branch information
Sefank authored Feb 20, 2022
1 parent d689bc5 commit 7a1573f
Showing 1 changed file with 18 additions and 14 deletions.
32 changes: 18 additions & 14 deletions docs/01 Getting started/02 Creating a window.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,47 +10,47 @@

注意,由于作者对教程做出了更新,之前本节使用的是GLEW库,但现在改为了使用GLAD库,关于GLEW配置的部分现在已经被修改,但我仍决定将这部分教程保留起来,放到一个历史存档中,如果有需要的话可以到[这里](../legacy.md)来查看。

在我们画出出色的效果之前,首先要做的就是创建一个OpenGL上下文(Context)和一个用于显示的窗口。然而,这些操作在每个系统上都是不一样的,OpenGL有目的地将这些操作抽象(Abstract)出去。这意味着我们不得不自己处理创建窗口,定义OpenGL上下文以及处理用户输入。
在我们画出出色的效果之前,首先要做的就是创建一个OpenGL上下文(Context)和一个用于显示的窗口。然而,这些操作在每个系统上都是不一样的,OpenGL有意将这些操作抽象(Abstract)出去。这意味着我们不得不自己处理创建窗口,定义OpenGL上下文以及处理用户输入。

幸运的是,有一些库已经提供了我们所需的功能,其中一部分是特别针对OpenGL的。这些库节省了我们书写操作系统相关代码的时间,提供给我们一个窗口和上下文用来渲染。最流行的几个库有GLUT,SDL,SFML和GLFW。在教程里我们将使用**GLFW**
幸运的是,有一些库已经提供了我们所需的功能,其中一部分是特别针对OpenGL的。这些库节省了我们书写操作系统相关代码的时间,提供给我们一个窗口和一个OpenGL上下文用来渲染。最流行的几个库有GLUT,SDL,SFML和GLFW。在教程里我们将使用**GLFW**。你可以随意选用其他类似的库,大多数库的配置方法和GLFW差不多

## GLFW

GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文定义窗口参数以及处理用户输入,这正是我们需要的
GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文定义窗口参数以及处理用户输入,对我们来说这就够了

<img alt="GLFW Logo" src="../../img/01/02/glfw.png" class="right" />

本节和下一节的目标是建立GLFW环境,并保证它恰当地创建OpenGL上下文并显示窗口。这篇教程会一步步从获取、编译、链接GLFW库讲起。我们使用的是Microsoft Visual Studio 2015 IDE(操作过程在新版的Visual Studio都是相同的)。如果你用的不是Visual Studio(或者用的是它的旧版本)请不要担心,大多数IDE上的操作都是类似的。
本节和下一节的目标是把GLFW环境配好能且能够跑起来,并保证它正确创建了OpenGL上下文并显示出一个简单的窗口来让我们随意使用。这篇教程会一步步教你如何获取、编译、链接GLFW库。我们使用的是Microsoft Visual Studio 2019 IDE(操作过程在更新的Visual Studio都是相同的)。如果你用的不是Visual Studio(或者用的是它的旧版本)请不要担心,大多数IDE上的操作都是类似的。

## 构建GLFW

GLFW可以从它官方网站的[下载页](http://www.glfw.org/download.html)上获取。GLFW已经有针对Visual Studio 2013/2015的预编译的二进制版本和相应的头文件,但是为了完整性我们将从编译源代码开始。所以我们需要下载**源代码包**
GLFW可以从它官方网站的[下载页](http://www.glfw.org/download.html)上获取。GLFW已提供为Visual Studio(2012到2019都有)预编译好的二进制版本和相应的头文件,但是为了完整性我们将从编译源代码开始。所以我们需要下载**源代码包**


!!! Attention

如果你要使用预编译的二进制版本的话,请下载32位的版本而不是64位的(除非你清楚你在做什么)。大部分读者反映64位版本会出现很多奇怪的问题
本教程中,我们将采用64位构建所有的库。因此如果您使用的是预编译的二进制文件,请确保你下载的是64位的二进制文件

下载源码包之后,将其解压并打开。我们只需要里面的这些内容:

- 编译生成的库
- **include**文件夹

从源代码编译库可以保证生成的库是兼容你的操作系统和CPU的,而预编译的二进制文件可能会出现兼容问题(甚至有时候没提供支持你系统的文件)。提供源代码所产生的一个问题在于不是每个人都用相同的IDE开发程序,因而提供的工程/解决方案文件可能和一些人的IDE不兼容。所以人们只能从.c/.cpp和.h/.hpp文件来自己建立工程/解决方案,这是一项枯燥的工作。但因此也诞生了一个叫做CMake的工具。
从源代码编译库可以保证生成的库完全适合你的操作系统和CPU的,而预编译的二进制文件则并非总是提供(有时候,即便提供了预编译的二进制文件,也可能不适用于您的系统)。开放源代码所产生问题在于:并不是每个人都用相同的IDE或者构建系统来搞开发,因而提供的项目/解决方案文件可能和一些人的IDE不兼容。所以人们必须使用给定的.c/.cpp和.h/.hpp文件来自己建立项目/解决方案,这是一项很枯燥的工作。但因此也诞生了一个叫做CMake的工具。

### CMake

CMake是一个工程文件生成工具。用户可以使用预定义好的CMake脚本,根据自己的选择(像是Visual Studio, Code::Blocks, Eclipse)生成不同IDE的工程文件。这允许我们从GLFW源码里创建一个Visual Studio 2015工程文件,之后进行编译。首先,我们需要从[这里](http://www.cmake.org/cmake/resources/software.html)下载安装CMake。我选择的是Win32安装程序
CMake是一个工程文件生成工具。用户可以使用预定义好的CMake脚本,根据自己的选择(像是Visual Studio, Code::Blocks, Eclipse)生成不同IDE的工程文件。这允许我们从GLFW源码创建一个Visual Studio 2019工程文件,之后进行编译。首先,我们需要从[这里](http://www.cmake.org/cmake/resources/software.html)下载安装CMake。

当CMake安装成功后,你可以选择从命令行或者GUI启动CMake,由于我不想让事情变得太过复杂,我们选择用GUI。CMake需要一个源代码目录和一个存放编译结果的目标文件目录。源代码目录我们选择GLFW的源代码的根目录,然后我们新建一个 *build* 文件夹,选中作为目标目录。
当CMake安装成功后,你可以选择从命令行或者GUI启动CMake,由于我们不想让事情变得太过复杂,我们选择用GUI。CMake需要一个源代码目录和一个存放编译结果的目标文件目录。源代码目录我们选择GLFW的源代码的根目录,然后我们新建一个 *build* 文件夹,选中作为目标目录。

![](../img/01/02/cmake.png)

在设置完源代码目录和目标目录之后,点击**Configure(设置)**按钮,让CMake读取设置和源代码。我们接下来需要选择工程的生成器,由于我们使用的是Visual Studio 2015,我们选择 **Visual Studio 14** 选项(因为Visual Studio 2015的内部版本号是14)。CMake会显示可选的编译选项用来配置最终生成的库。这里我们使用默认设置,并再次点击**Configure(设置)**按钮保存设置。保存之后,点击**Generate(生成)**按钮,生成的工程文件会在你的**build**文件夹中。
在设置完源代码目录和目标目录之后,点击**Configure(设置)**按钮,让CMake读取设置和源代码。我们接下来需要选择工程的生成器,由于我们使用的是Visual Studio 2019,我们选择 **Visual Studio 16** 选项(因为Visual Studio 2019的内部版本号是16)。CMake会显示可选的编译选项用来配置最终生成的库。这里我们使用默认设置,并再次点击**Configure(设置)**按钮保存设置。保存之后,点击**Generate(生成)**按钮,生成的工程文件会在你的**build**文件夹中。

### 编译

**build**文件夹里可以找到**GLFW.sln**文件,用Visual Studio 2015打开。因为CMake已经配置好了项目,所以我们直接点击**Build Solution(生成解决方案)**按钮,然后编译的库**glfw3.lib**(注意我们用的是第3版)就会出现在**src/Debug**文件夹内
**build**文件夹里可以找到**GLFW.sln**文件,用Visual Studio 2019打开。因为CMake已经配置好了项目,并按照默认配置将其编译为64位的库,所以我们直接点击**Build Solution(生成解决方案)**按钮,然后在**build/src/Debug**文件夹内就会出现我们编译出的库文件**glfw3.lib**

库生成完毕之后,我们需要让IDE知道库和头文件的位置。有两种方法:

Expand All @@ -61,7 +61,11 @@ CMake是一个工程文件生成工具。用户可以使用预定义好的CMake

## 我们的第一个工程

首先,打开Visual Studio,创建一个新的项目。如果VS提供了多个选项,选择Visual C++,然后选择**Empty Project(空项目)**(别忘了给你的项目起一个合适的名字)。现在我们终于有一个空的工作空间了,开始创建我们第一个OpenGL程序吧!
首先,打开Visual Studio,创建一个新的项目。如果VS提供了多个选项,选择Visual C++,然后选择**Empty Project(空项目)**(别忘了给你的项目起一个合适的名字)。由于我们将在64位模式中执行所有操作,而新项目默认是32位的,因此我们需要将Debug旁边顶部的下拉列表从x86更改为x64:

![](../img/01/02/x64.png)

现在我们终于有一个空的工作空间了,开始创建我们第一个OpenGL程序吧!

## 链接

Expand All @@ -85,7 +89,7 @@ CMake是一个工程文件生成工具。用户可以使用预定义好的CMake

### Windows上的OpenGL库

如果你是Windows平台,**opengl32.lib**已经包含在Microsoft SDK里了,它在Visual Studio安装的时候就默认安装了。由于这篇教程用的是VS编译器,并且是在Windows操作系统上,我们只需将**opengl32.lib**添加进连接器设置里就行了。
如果你是Windows平台,**opengl32.lib**已经包含在Microsoft SDK里了,它在Visual Studio安装的时候就默认安装了。由于这篇教程用的是VS编译器,并且是在Windows操作系统上,我们只需将**opengl32.lib**添加进连接器设置里就行了。值得注意的是,OpenGL库64位版本的文件名仍然是**opengl32.lib**(和32位版本一样),虽然很奇怪但确实如此。

### Linux上的OpenGL库

Expand Down Expand Up @@ -123,7 +127,7 @@ glGenBuffers(1, &buffer);
GLAD是一个[开源](https://github.com/Dav1dde/glad)的库,它能解决我们上面提到的那个繁琐的问题。GLAD的配置与大多数的开源库有些许的不同,GLAD使用了一个[在线服务](http://glad.dav1d.de/)。在这里我们能够告诉GLAD需要定义的OpenGL版本,并且根据这个版本加载所有相关的OpenGL函数。
打开GLAD的[在线服务](http://glad.dav1d.de/),将语言(Language)设置为**C/C++**,在API选项中,选择**3.3**以上的OpenGL(gl)版本(我们的教程中将使用3.3版本,但更新的版本也能正常工作)。之后将模式(Profile)设置为**Core**,并且保证**生成加载器**(Generate a loader)的选项是选中的。现在可以先(暂时)忽略拓展(Extensions)中的内容。都选择完之后,点击**生成**(Generate)按钮来生成库文件。
打开GLAD的[在线服务](http://glad.dav1d.de/),将语言(Language)设置为**C/C++**,在API选项中,选择**3.3**以上的OpenGL(gl)版本(我们的教程中将使用3.3版本,但更新的版本也能用)。之后将模式(Profile)设置为**Core**,并且保证选中了**生成加载器**(Generate a loader)选项。现在可以先(暂时)忽略扩展(Extensions)中的内容。都选择完之后,点击**生成**(Generate)按钮来生成库文件。
GLAD现在应该提供给你了一个zip压缩文件,包含两个头文件目录,和一个**glad.c**文件。将两个头文件目录(**glad**和**KHR**)复制到你的**Include**文件夹中(或者增加一个额外的项目指向这些目录),并添加**glad.c**文件到你的工程中。
Expand Down

0 comments on commit 7a1573f

Please sign in to comment.