[OpengGL] 创建一个窗口[3]

英文原文:https://learnopengl.com/Getting-started/Creating-a-window

  在我们开始创建令人惊叹的图形之前,我们需要做的第一件事是创建一个 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/OS 完美定制的,豪华的预编译二进制文件并不总是提供(有时,预编译二进制文件不适用于您的系统)。 然而,向开放世界提供源代码的问题在于并非每个人都使用相同的 IDE 或构建系统来开发他们的应用程序,这意味着提供的项目/解决方案文件可能与其他人的设置不兼容。 因此,人们必须使用给定的 .c/.cpp 和 .h/.hpp 文件设置自己的项目/解决方案,这很麻烦。 正是出于这些原因,有一个名为 CMake 的工具。

CMake

  CMake 是一种工具,可以使用预定义的 CMake 脚本从一组源代码文件中生成用户选择的项目/解决方案文件(例如 Visual Studio、Code::Blocks、Eclipse)。 这允许我们从 GLFW 的源包生成一个 Visual Studio 2019 项目文件,我们可以用它来编译库。 首先我们需要下载并安装CMake,可以在他们的下载页面上下载。

  安装 CMake 后,您可以选择从命令行或通过其 GUI 运行 CMake。 因为我们不想让事情过于复杂,所以我们将使用 GUI。 CMake 需要源代码文件夹和二进制文件的目标文件夹。 对于源代码文件夹,我们将选择下载的 GLFW 源包的根文件夹,对于构建文件夹,我们将创建一个新目录 build,然后选择该目录。
在这里插入图片描述
  设置源文件夹和目标文件夹后,单击“配置”按钮,以便 CMake 可以读取所需的设置和源代码。 然后我们必须为项目选择生成器,因为我们使用的是 Visual Studio 2019,所以我们将选择 Visual Studio 16 选项(Visual Studio 2019 也称为 Visual Studio 16)。 然后 CMake 将显示可能的构建选项来配置生成的库。 我们可以将它们保留为默认值,然后再次单击配置以存储设置。 设置完成后,我们单击生成,生成的项目文件将生成在您的构建文件夹中。

编译

  在构建文件夹中,现在可以找到一个名为 GLFW.sln 的文件,我们使用 Visual Studio 2019 打开它。由于 CMake 生成的项目文件已经包含正确的配置设置,我们只需要构建解决方案。 CMake 应该会自动配置解决方案,以便将其编译为 64 位库; 现在点击构建解决方案。 这将为我们提供一个已编译的库文件,该文件可以在名为 glfw3.lib 的 build/src/Debug 中找到。

  一旦我们生成了库,我们需要确保 IDE 知道在哪里可以找到我们的 OpenGL 程序的库和包含文件。 有两种常见的方法可以做到这一点:

  1. 我们找到IDE/compiler的/lib和/include文件夹,将GLFW的include文件夹中的内容添加到IDE的/include文件夹中,同样将glfw3.lib添加到IDE的/lib文件夹中。 这可行,但不是推荐的方法。 很难跟踪您的库并包含文件,并且新安装的 IDE/编译器导致您不得不重新执行此过程。
  2. 另一种方法(推荐)是在您选择的位置创建一组新目录,其中包含您可以从 IDE/编译器引用的第三方库中的所有头文件/库。 例如,您可以创建一个包含 Libs 和 Include 文件夹的文件夹,我们分别在其中存储 OpenGL 项目的所有库文件和头文件。 现在,所有第三方库都组织在一个位置(可以在多台计算机之间共享)。 然而,要求是每次我们创建一个新项目时,我们都必须告诉 IDE 在哪里可以找到这些目录。

一旦所需的文件存储在您选择的位置,我们就可以开始创建我们的第一个 OpenGL GLFW 项目。

我们的第一个项目

  首先,让我们打开 Visual Studio 并创建一个新项目。 如果给出了多个选项,请选择 C++,然后选择 Empty Project(不要忘记为您的项目取一个合适的名称)。 由于我们将在 64 位中执行所有操作,并且项目默认为 32 位,因此我们需要将 Debug 旁边顶部的下拉列表从 x86 更改为 x64。

在这里插入图片描述
一旦完成,我们现在就有了一个工作区来创建我们的第一个 OpenGL 应用程序!

Linking

  为了让项目使用 GLFW,我们需要将库链接到我们的项目。 这可以通过在链接器设置中指定我们要使用 glfw3.lib 来完成,但是我们的项目还不知道在哪里可以找到 glfw3.lib,因为我们将第三方库存储在不同的目录中。 因此,我们需要先将此目录添加到项目中。

  我们可以告诉 IDE 在需要查找库和包含文件时考虑这个目录。 在解决方案资源管理器中右键单击项目名称,然后转到 VC++ 目录,如下图所示:

在这里插入图片描述
  从那里开始,您可以添加自己的目录,让项目知道在哪里搜索。 这可以通过手动将其插入文本或单击适当的位置字符串并选择 <Edit…> 选项来完成。 对库目录和包含目录执行此操作:
在这里插入图片描述

  在这里,您可以添加任意多的额外目录,从那时起,IDE在搜索库和头文件时也会搜索这些目录。一旦包含了来自GLFW的Include文件夹,您就可以通过包含<glfw …=“”>来找到GLFW的所有头文件。< glfw/… >这同样适用于库目录。

  由于VS现在可以找到所有需要的文件,我们最终可以通过链接器选项卡和输入链接GLFW到项目:
在这里插入图片描述
  要链接到库,您必须将库的名称指定给链接器。因为库名称是glfw3。库中,我们将其添加到附加依赖项字段(手动或使用<edit…< span=“”>>选项),从那时起,编译时将链接GLFW。除了GLFW,我们还应该向OpenGL库添加一个链接条目,但这可能会因操作系统而异:</edit…<>

Windows上的OpenGL库

  如果你在Windows上OpenGL库opengl32.lib附带Microsoft SDK,它在安装Visual Studio时默认安装。由于本章使用VS编译器,并且是在windows上,我们添加opengl32。链接器设置的库。注意,OpenGL库的64位等价物称为opengl32.Lib,就像32位的等价物一样,这是一个有点不幸的名字。

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的设置和配置。

GLAD

  我们还没有完全做到,因为我们还需要做另一件事。因为OpenGL只是一个真正的标准/规范,所以驱动程序制造商要将该规范实现到特定显卡支持的驱动程序。由于OpenGL驱动程序有许多不同的版本,大多数函数的位置在编译时是不知道的,需要在运行时查询。然后,开发人员的任务是检索他/她需要的函数的位置,并将它们存储在函数指针中以供以后使用。检索这些位置是操作系统特定的。在Windows中,它看起来像这样:

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

  正如你所看到的,代码看起来很复杂,为每个你可能需要但还没有声明的函数这样做是一个繁琐的过程。值得庆幸的是,也有用于此目的的库,其中GLAD是一个流行的、最新的库。

设置GLAD

  GLAD是一个开源库,它管理我们谈到的所有繁琐的工作。GLAD的配置设置与大多数常见的开放源码库略有不同。GLAD使用一个web服务,我们可以告诉GLAD我们想为哪个版本的OpenGL定义并根据该版本加载所有相关的OpenGL函数。

  转到GLAD web服务,确保语言设置为c++,并在API部分选择至少3.3的OpenGL版本(这是我们将要使用的;更高版本也可以)。还要确保配置文件被设置为Core,并且Generate a loader选项被选中。暂时忽略扩展,然后单击Generate生成生成的库文件。

  到目前为止,GLAD应该已经为您提供了一个包含两个include文件夹和一个happy .c文件的zip文件。将两个包含文件夹(glad和KHR)复制到include(s) directoy中(或添加指向这些文件夹的额外项),并将glad.c文件添加到项目中。

  在前面的步骤之后,你应该能够在你的文件上面添加下面的include指令:

#include <glad/glad.h> 

  点击编译按钮应该不会给你任何错误,此时我们将进入下一章,在那里我们将讨论如何实际使用GLFW和GLAD来配置OpenGL上下文并生成窗口。请确保检查所有include和库目录都是正确的,并且链接器设置中的库名称与相应的库名称相匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值