OpenGL学习笔记2-Creating a window

创建一个窗口

在开始创建令人惊叹的图形之前,我们需要做的第一件事是创建一个OpenGL上下文和一个绘图的应用程序窗口。但是,这些操作对于每个操作系统都是特定的,并且OpenGL有意尝试将自己从这些操作中抽象出来。这意味着我们必须自己创建窗口、定义上下文和处理用户输入。

幸运的是,有相当多的库提供了我们所寻求的功能,其中一些是专门针对OpenGL的。这些库为我们保存了所有与操作系统相关的工作,并为我们提供了一个窗口和一个OpenGL上下文来进行渲染。一些比较流行的库是GLUT、SDL、SFML和GLFW。在LearnOpenGL上,我们将使用GLFW。可以随意使用任何其他库,most的设置类似于GLFW的设置。

GLFW

GLFW是一个用C编写的库,专门针对OpenGL。GLFW为我们提供了将好东西呈现到屏幕上所必需的基本条件。它允许我们创建OpenGL上下文、定义窗口参数和处理用户输入,这对于我们的目的已经足够了。

这一章和下一章的重点是建立并运行GLFW,确保它正确地创建了一个OpenGL上下文,并显示了一个简单的窗口供我们随意处理。本章将一步一步地检索、构建和链接GLFW库。在撰写本文时,我们将使用Microsoft Visual Studio 2019 IDE(注意,在最近的Visual Studio版本上,过程是相同的)。如果您没有使用Visual Studio(或更老的版本),不用担心,在大多数其他ide上的过程都是类似的。

构建GLFW

可从其网页的下载页面获得GLFW。到2019年为止,GLFW已经为Visual Studio 2012预编译了二进制文件和头文件,但是为了完整起见,我们将自己从源代码编译GLFW。这是为了让您对自己编译开源库的过程有一种感觉,因为并不是每个库都有可用的预编译二进制文件。让我们下载源代码包。

我们将把所有库构建为64位二进制文件,所以如果您使用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源代码包的根文件夹,对于构建文件夹,我们将创建一个新的目录构建,然后选择该目录。

设置好源文件夹和目标文件夹后,单击Configure按钮,以便CMake可以读取所需的设置和源代码。然后我们必须为项目选择生成器,因为我们使用的是Visual Studio 2019,所以我们将选择Visual Studio 16选项(Visual Studio 2019也被称为Visual Studio 16)。然后CMake将显示可能的构建选项来配置生成的库。我们可以将它们保留为默认值,然后再次单击Configure来存储设置。设置好设置之后,单击Generate,生成的项目文件将在构建文件夹中生成。

编译

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

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

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

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

我们的第一个项目

首先,让我们打开Visual Studio并创建一个新项目。如果有多个选项,请选择c++并接受空项目(不要忘记给项目起一个合适的名称)。因为我们要做的一切都是64位的,而项目默认是32位的,所以我们需要把上面的下拉菜单从x86改为x64:

一旦完成,我们现在就有了一个工作空间来创建我们的第一个OpenGL应用程序!

链接

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

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

从这里开始,您可以添加自己的目录,让项目知道在哪里搜索。这可以通过手动将其插入文本或单击适当的位置字符串并选择<Edit. >选择。对库目录和include目录都这样做:

在这里,你可以添加任意多的额外目录,在IDE中搜索库和头文件时也可以搜索这些目录。一旦包含了来自GLFW的Include文件夹,您将能够通过Include <GLFW/..>;找到所有的GLFW头文件。库目录也是如此。

由于VS现在可以找到所有需要的文件,我们终于可以通过链接器选项卡和输入将GLFW链接到项目:

然后,要链接到一个库,就必须将库的名称指定给链接器。由于库名是glfw3,我们将其添加到附加的依赖项字段(手动或使用 <Edit..> 选项),然后在编译时将链接GLFW。除了GLFW之外,我们还应该添加一个到OpenGL库的链接条目,但这可能因操作系统的不同而不同:

Windows上的OpenGL库

如果你在Windows上,OpenGL库opengl32.lib随微软SDK一起提供,当你安装Visual Studio时,默认安装该SDK。由于本章使用的是VS编译器,而且是在windows上,所以我们在链接器设置中添加了opengl32.lib。注意,与OpenGL库等价的64位库称为opengl32,就像32位库一样,这是一个有点不幸的名字。

Linux上的OpenGL库

在Linux系统上,需要通过在链接器设置中添加-lGL链接到libGL库。如果你找不到库,你可能需要安装任何Mesa, NVidia或AMD的开发包。

然后,一旦你添加了GLFW和OpenGL库到链接器设置,你可以包括头文件为GLFW如下:

#include <GLFW\glfw3.h>

对于使用GCC编译的Linux用户,下面的命令行选项可以帮助您编译项目:-lglfw3 -lGL -lX11 -lpthread -lXrandr -lXi -ldl。不正确地链接相应的库将生成许多未定义的引用错误。

本文结束了GLFW的设置和配置。

GLAD

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

// define the function's prototype
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// find the function and assign it to a function pointer
GL_GENBUFFERS glGenBuffers  = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// function can now be called as normal
unsigned int buffer;
glGenBuffers(1, &buffer);

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

设置GLAD

GLAD是一个开源库,用于管理我们所讨论的所有繁琐工作。与大多数常见的开源库相比,GLAD的配置设置略有不同。GLAD使用一个web服务,我们可以告诉GLAD我们想为哪个版本的OpenGL定义和加载所有相关的OpenGL函数。

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

很高兴现在已经为您提供了包含两个include文件夹和一个gladc文件的zip文件。将两个include文件夹(glad和KHR)复制到include目录中(或添加一个指向这些文件夹的额外项),并将glad.c文件添加到项目中。

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

#include <glad/glad.h> 

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

额外的资源

  • GLFW: Window Guide: 关于设置和配置一个GLFW窗口的官方指南。
  • Building applications: 提供有关应用程序编译/链接过程的大量信息,以及可能出现的大量错误(以及解决方案)。
  • GLFW with Code::Blocks: building GLFW in Code::Blocks IDE.
  • Running CMake: 简要概述如何在Windows和Linux上运行CMake。
  • Writing a build system under Linux: 由Wouter Verholst编写的关于如何在Linux下编写构建系统的autotools教程.
  • Polytonic/Glitter: 一个简单的样板项目,预先配置了所有相关库;如果您想要一个示例项目而又不想自己编译所有库,那么这个功能非常棒。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值