OpenGL超级宝典(第7版)笔记1 清单的初始环境配置part1
文章目录
由于OpenGL超级宝典(第7版)异步社区中下载的头文件和相关资源经过多次的实验仍不能在我的电脑中安装,我只能另辟蹊径,采用learnOpenGL中的推荐的 GLFW 来对sb7.h中的一些功能进行一些替代,到目前为止仍能找到替代方法(截止5.3着色器储存区块,因为我当前只学到5.3后面的还没试验过,O(∩_∩)O,虽然有些地方需要我们自己添加一些代码),希望我们能够学到最后吧
转载自learnOpenGL的GLFW配置
这里其实我是直接下载的 .lib 和 .h 文件然后直接在 visual studio 中设置就行了,没有采用cmake来编译(因为这个cmake我也不太会用),当然我仍然把流程转载过来了,防止 LearnOpenGL 网站中更改了推荐的窗口库,我们仍然能用一下的流程来对GLFW进行一个配置。(要是我不转载,网站一旦更改后面的内容就令人费解了,毕竟我们需要调用很多的GLFW函数,以实现很多的功能)
1 构建GLFW
1.1下载GLFW
GLFW可以从它官方网站的下载页上获取。GLFW已经有针对Visual Studio 2012/2013的预编译的二进制版本和相应的头文件,但是为了完整性我们将从编译源代码开始。所以我们需要下载源代码包。
注意
当你下载二进制版本时,请下载32位的版本而不是64位的除非你清楚你在做什么。大部分读者反映64位版本会出现很多奇怪的问题。
下载源码包之后,将其解压并打开。我们只需要里面的这些内容:
- 编译生成的库
- include文件夹
从源代码编译库可以保证生成的库是兼容你的操作系统和CPU的,而预编译的二进制文件可能会出现兼容问题(甚至有时候没提供支持你系统的文件)。
虽然我是直接复制的别人的二进制文件,但是大家不要学我
提供源代码所产生的一个问题在于不是每个人都用相同的IDE开发程序,因而提供的工程文件可能和一些人的IDE不兼容。所以人们只能从.cpp和.h文件来自己建立工程,这是一项笨重的工作。因此诞生了一个叫做CMake的工具。
1.2使用CMake生成工程文件
CMake是一个工程文件生成工具。用户可以使用预定义好的CMake脚本,根据自己的选择(像是Visual Studio, Code::Blocks, Eclipse)生成不同IDE的工程文件。这允许我们从GLFW源码里创建一个Visual Studio 2012工程文件,之后进行编译。首先,我们需要从这里下载安装CMake。我选择的是Win32安装程序。
当CMake安装成功后,你可以选择从命令行或者GUI启动CMake,由于我不想让事情变得太过复杂,我们选择用GUI。CMake需要一个源代码目录和一个存放编译结果的目标文件目录。源代码目录我们选择GLFW的源代码的根目录,然后我们新建一个 build 文件夹,选中作为目标目录。(即把cmake运行后的工程文件放在build文件夹中)
然后,点击 Configure(设置) 按钮,让CMake读取设置和源代码。接下来,我们选择工程的生成器为 Visual Studio 11(因为Visual Studio 2012的内部版本号是11.0,这里要根据你的IDE版本选择,即你用的是Visual Studio哪个版本)。CMake会显示可选的编译选项,这里我们使用默认设置,再次点击 Configure(设置) 按钮保存设置。保存之后,点击 Generate(生成) 按钮,生成的工程文件会在你的build文件夹中。
1.3cmake编译生成二进制文件
在build文件夹里可以找到GLFW.sln文件,用Visual Studio 2012打开。因为CMake已经配置好了项目,所以我们直接点击 Build Solution(生成解决方案) 按钮,然后编译的库glfw3.lib(注意我们用的是第3版)就会出现在src/Debug文件夹内。
库生成完毕之后,我们需要让IDE知道库和头文件的位置。有两种方法(具体过程后面有展示):
- 找到IDE或者编译器的/lib和/include文件夹,添加GLFW的include文件夹里的文件到IDE的/include文件夹里去。用类似的方法,将glfw3.lib添加到/lib文件夹里去。虽然这样能工作,但这不是推荐的方式,因为这样会让你很难去管理库和include文件,而且重新安装IDE或编译器可能会导致这些文件丢失。
- 推荐的方式是建立一个新的目录包含所有的第三方库文件和头文件,并且在你的IDE或编译器中指定这些文件夹。我个人会使用一个单独的文件夹,里面包含Libs和Include文件夹,在这里存放OpenGL工程用到的所有第三方库和头文件。这样我的所有第三方库都在同一个位置(并且可以共享至多台电脑)。然而这要求你每次新建一个工程时都需要告诉IDE/编译器在哪能找到这些目录。
完成上面步骤后,我们就可以使用GLFW创建我们的第一个OpenGL工程了!
2 我们的第一个工程
打开Visual Studio,创建一个新的项目。如果VS提供了多个选项,选择Visual C++,然后选择Empty Project(空项目)(别忘了给你的项目起一个合适的名字)。现在我们终于有一个空的工作空间了,开始创建我们第一个OpenGL程序吧。
2.1链接GLFW
为了使我们的程序使用GLFW,我们需要把GLFW库链接(Link)进工程。这可以通过在链接器的设置里指定我们要使用glfw3.lib来完成,但是由于我们将第三方库放在另外的目录中,我们的工程还不知道在哪寻找这个文件。于是我们首先需要 将我们放第三方库的目录添加进设置。
要添加这些目录(需要VS搜索库和include文件的地方),我们首先进入Project Properties(工程属性,在解决方案窗口里右键项目),然后选择 VC++ Directories(VC++ 目录) 选项卡(如下图)。在下面的两栏添加目录:
这里你可以把自己的目录加进去,让工程知道到哪去搜索。你需要手动把目录加在后面,也可以点击需要的位置字符串,选择选项,之后会出现类似下面这幅图的界面,图是选择 Include Directories(包含目录) 时的界面:
这里可以添加任意多个目录,IDE会从这些目录里寻找头文件(你要把GLFW的一些头文件放进去,这样在调用的时候才能找到比如:#include<glfw3.h>)。所以只要你将GLFW的Include文件夹加进路径中,你就可以使用<GLFW/…>来引用头文件。库文件夹也是一样的。
就是说你的文件如果没有放在Include的目录下(可能在Include/GLFW,那个名为GLFW的子文件夹中),你可以使用<GLFW/…>来引用头文件(比如<GLFW/glfw3.h>),不过推荐放在Include文件夹中,方便一些。
现在VS可以找到所需的所有文件了。最后需要在 Linker(链接器) 选项卡里的 Input(输入) 选项卡里添加glfw3.lib这个文件:
要链接一个库我们必须告诉链接器它的文件名。库名字是glfw3.lib,我们把它 加到Additional Dependencies(附加依赖项) 字段中(手动或者使用选项都可以)。这样GLFW在编译的时候就会被链接进来了。除了GLFW之外,你还需要添加一个链接条目链接到OpenGL的库,但是这个库可能因为系统的不同而有一些差别。
Windows上的OpenGL库 如果你是Windows平台,opengl32.lib已经包含在Microsoft SDK里了,它在Visual
Studio安装的时候就默认安装了。由于这篇教程用的是VS编译器,并且是在Windows操作系统上,我们只需将opengl32.lib添加进连接器设置里就行了。
Linux上的OpenGL库
在Linux下你需要链接libGL.so库文件,这需要添加-lGL到你的链接器设置中。如果找不到这个库你可能需要安装Mesa,NVidia或AMD的开发包,这部分因平台而异(而且我也不熟悉Linux)就不仔细讲解了。
接下来,如果你已经添加GLFW和OpenGL库到连接器设置中,你可以用如下方式添加GLFW头文件:
#include <GLFW\glfw3.h>
当然如果你放在的Include之下就直接#include <glfw3.h>就行了,如果你放在GLFW的子文件夹中就按照上面调用就行了。
GLFW的安装与配置就到此为止。
2.2链接GLEW
到这里,我们仍然有一件事要做。因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针*以后使用。取得地址的方法因平台而异,在Windows上会是类似这样:
// 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 现在函数可以被正常调用了
GLuint buffer;
glGenBuffers(1, &buffer);
你可以看到代码非常复杂,而且很繁琐,我们需要对每个可能使用的函数都要重复这个过程。幸运的是,有些库能简化此过程,其中GLEW是目前最新,也是最流行的库。
编译和链接GLEW
GLEW是OpenGL Extension Wrangler Library的缩写,它能解决我们上面提到的那个繁琐的问题。因为GLEW也是一个库,我们同样需要构建并将其链接进工程。GLEW可以从这里下载,你同样可以选择下载二进制版本,如果你的目标平台列在上面的话,或者下载源码编译,步骤和编译GLFW时差不多。记住,如果不确定的话,选择32位的二进制版本。
我们使用GLEW的静态版本glew32s.lib(注意这里的“s”),将库文件添加到你的库目录,将include内容添加到你的include目录。接下来,在VS的链接器选项里加上glew32s.lib。注意GLFW3(默认)也是编译成了一个静态库。
静态(Static)链接是指编译时就将库代码里的内容整合进你的二进制文件。优点就是你不需要管理额外的文件了,只需要发布你单独的一个二进制文件就行了。缺点就是你的可执行文件会变得更大,另外当库有升级版本时,你必须重新进行编译整个程序。
动态(Dynamic)链接是指一个库通过.dll或.so的方式存在,它的代码与你的二进制文件的代码是分离的。优点是使你的二进制文件大小变小并且更容易升级,缺点是你最终发布程序时必须带上这些DLL。
如果你希望静态链接GLEW,必须在包含GLEW头文件之前定义预处理器宏GLEW_STATIC:
#define GLEW_STATIC
#include <GL/glew.h>
注意这里glew.h的文件是放在了Include/GL的名为GL的子文件夹下的,所以要用#include <GL/glew.h>,如果你把它放在了Include文件夹下,那么直接#include <glew.h>这样调用就行了。
如果你希望动态链接,那么你可以省略这个宏。但是记住使用动态链接的话你需要拷贝一份.DLL文件到你的应用程序目录。
对于用GCC编译的Linux用户建议使用这个命令行选项-lGLEW -lglfw3 -lGL -lX11 -lpthread
-lXrandr -lXi。没有正确链接相应的库会产生 undefined reference(未定义的引用) 这个错误。
我们现在成功编译了GLFW和GLEW库,我们已经准备好将进入下一节去真正使用GLFW和GLEW来设置OpenGL上下文并创建窗口。记得确保你的头文件和库文件的目录设置正确,以及链接器里引用的库文件名正确。如果仍然遇到错误,可以先看一下评论有没有人遇到类似的问题,请参考额外资源中的例子或者在下面的评论区提问。
附加资源
- Building applications: 提供了很多编译或链接相关的信息和一大列错误及对应的解决方案。
- GLFW with Code::Blocks:使用Code::Blocks IDE编译GLFW。
- Running CMake: 简要的介绍如何在Windows和Linux上使用CMake。
- Writing a build system under Linux: Wouter Verholst写的一个autotools的教程,讲的是如何在Linux上编写构建系统,尤其是针对这些教程。
- Polytonic/Glitter: 一个简单的样板项目,它已经提前配置了所有相关的库;如果你想要很方便地搞到一个LearnOpenGL教程的范例工程,这也是很不错的。
3 总结
这一次我们配置了一下GLFW窗口库,还顺便配置了一下GLEW帮助我们更方便的应对OpenGL的各种版本,下次我们将亲自用GLFW打开一个窗口,并做一些推进(我们不能仅仅止步于打开一个窗口,虽然我们打开一个窗口已经够费劲的了)。
我们下篇见~~
声明
(声明本篇是基于LearnOpenGL内容的搬运,原网站的网址为 https://learnopengl-cn.readthedocs.io/zh/latest/ )欢迎浏览(如侵速删)
我看过的相关内容
以下并不是全看完了,大部分看了15%就看不下去了,实在是没看懂。(本人没什么计算机编程基础,算是野生程序员吧,很多内容都不能标准表述,望见谅)
如果你对opengl的工作有了一定的了解,我一开始也是从这里开始的,但是仍然有很多的不懂的,最后至今为止,我杂糅了很多的网站内容包括LearnOpenGL、极客学院、哔哩哔哩的闫令琪计算机图形学、哔哩哔哩的傅老师的OpenGL课程、OpenGL编程指南"也称为红宝书"、OpenGL超级宝典"也称为蓝宝书"、当然还有很多的csdn文章O(∩_∩)O这就不介绍了,等用到是时候我在放链接吧O(∩_∩)O
这里面图形学比较易懂也很基础推荐可以作为开始(如果你是学OpenGL需要马上用,应该可以跳过,但是其中的内容很是很重要,这会让后面涉及变换透视的章节更加易懂,推荐大家看看),之后是蓝宝书或是极客学院翻译的教程比较推荐,这两个还是比较适合你我这样的新手的。
这里不推荐看的是红宝书,这本书我看了有点类似于字典那样的工具书,不太适合新手上手学,而且讲的也并不是很通俗易懂(可能是我的书版本比较老吧…)
加油
当然如果你对我有信心,我也会持续更新(虽然前路漫漫),跟大家一同进步(虽然很可能没人看(╥╯^╰╥),无所谓了,当然如有错误还请大家指正∠(°ゝ°),哪里不懂我会尽力解决,哪里说的不好也可以指出我会及时修改~)
我们下篇见~~