OpenGL入门1.0:环境搭建
OpenGL入门1.0:环境
每一个小步骤的源码都放在了Github
的内容为插入注释,可以先跳过
准备工作:
GLFW
GLFW 是一个专门针对 OpenGL 的 C 语言库,它提供了一些渲染物体所需的最低限度的接口,允许用户创建 OpenGL 上下文,定义窗口参数以及处理用户输入
先去官网获取 GLFW 的 Source package,我们只需要里面的 include 文件夹和我们自己编译生成的库。(为什么要在自己机器上编译?因为从源代码编译库可以保证生成的库是兼容你的操作系统和 CPU 的,而预编译的二进制文件可能会出现兼容问题,甚至有时候没提供支持你系统的文件)
但是提供源代码所产生的一个问题在于不是每个人都用相同的 IDE 开发程序,因而源码提供的工程/解决方案文件可能和一些 IDE 不兼容。你只能从 .c/.cpp 和 .h/.hpp 文件来自己建立工程/解决方案,这是一项枯燥的工作,所以这里我们需要用到一个叫 CMake 的工具
CMake
CMake(cross platform make)是一个工程文件生成工具 http://www.cmake.org/cmake/resources/software.html
我们可以使用预定义好的 CMake 脚本(刚才下载的 Source package 里就有了),根据自己的选择(像是 Visual Studio, Code::Blocks, Eclipse)生成不同IDE的工程文件。这个工具就能让我们从 GLFW 源码里创建一个 Visual Studio 2017工程文件,之后就能顺利编译。
CMake 需要一个源代码目录和一个存放编译结果的目标文件目录,源代码目录我们选择下载的 GLFW 的源代码的根目录,然后我们新建一个 build 文件夹作为目标目录。
在设置完目录之后,点击 Configure(设置) 按钮,让 CMake 读取设置和源代码。我们接下来需要选择工程的生成器,这里我选择 Visual Studio 2017 (根据自己的IDE版本设定)CMake 会显示可选的编译选项用来配置最终生成的库。
这里我们使用默认设置,Finish 后再次点击 Configure(设置) 按钮保存设置。保存之后,点击 Generate(生成) 按钮,生成的工程文件会在你的 build 文件夹中
编译
在 build 文件夹里可以找到 GLFW.sln 文件,用 Visual Studio 2017 打开,因为 CMake 已经配置好了项目,所以我们直接点击 (build)生成->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 /编译器在哪能找到这些目录
这里我选择第二个方式,建立一个文件夹放好了头文件和 lib 文件,就可以开始第一个工程了
建立第一个工程并链接
首先,打开 Visual Studio,创建一个新的项目,如果 VS 提供了多个选项,选择 Visual C++,然后选择 Empty Project(空项目)
为了使我们的程序使用 GLFW,我们需要把 GLFW 库链接 (Link) 进工程。这可以通过在链接器的设置里指定我们要使用 glfw3.lib 来完成,但是由于我们将第三方库放在另外的目录 Libraries 中,我们的工程还不知道在哪寻找这个文件,于是我们首先需要将我们放第三方库的目录添加进设置
要添加这些目录(需要VS搜索库和include文件的地方),我们首先进入 Project Properties (工程属性,在解决方案窗口里右键项目),然后选择 VC++ Directories(VC++ 目录) 选项卡(如下图)
我们需要把存放头文件的Include文件夹添加到包含目录,把存放库glfw3.lib的Lib文件夹添加到库目录
这里可以添加任意多个目录,IDE会从这些目录里寻找头文件。所以只要你将GLFW的Include文件夹加进路径中,你就可以使用<GLFW/..>
来引用头文件。库文件夹也是一样的
最后得到
现在VS可以找到所需的所有文件了,最后需要在 Linker(链接器) 选项卡里的 Input(输入) 选项卡里添加 glfw3.lib 和 opengl32.lib(我是 Windows 平台,opengl32.lib 已经包含在 Microsoft SDK 里了,它在 Visual Studio 安装的时候就默认安装了,我们只需将 opengl32.lib 直接添加进连接器设置里就行了)
要链接一个库我们必须告诉链接器它的文件名。库名字是 glfw3.lib,我们把它加到附加依赖项字段中 (点击编辑,输入就glfw3.lib) ,这样GLFW在编译的时候就会被链接进来了。
最后注意我们编译 glfw 库时候的编译选项是否和本项目相同,如图:
我的两个项目都是 Debug x64 选项下编译的,如果不同可能会出现 .lib 连接不上而导致的 LNK2019 错误。
GLAD
OpenGL 只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的,由于 OpenGL 驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询,所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。幸运的是,有些库能简化此过程,其中 **GLAD **是目前最流行的库。
GLAD是一个 开源 的库,它能解决我们上面提到的那个繁琐的问题,打开GLAD的 在线服务,将语言(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 文件到你的工程里
经过前面的这些步骤之后,你就应该可以将以下的指令加到你的文件顶部了:
#include <glad/glad.h>
这时候为了检验我们的环境,我们需要加入一个main函数入口,否则直接点击编译按钮应该会出现以下情况:
现在我们建立一个 test.cpp 文件加入
int main()
{
retuen 0;
}
没有报错,那么证明我们的包含目录设置正确。但是要检验 .lib 库我们还需要更改下 test.cpp 的代码(现在你不需要看懂这些函数,我们只是为了检验刚搭建好的环境)。
#include <glad/glad.h>
#include <GLFW/glfw3.h>
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);//for Mac
return 0;
}
编译后如果没有任何报错,那么环境的搭建就大功告成了。如果出现 LNK2019 等连接错误,请务必检查:
- VC++目录->包含目录/引用目录 的内容是否设置正确。
- 连接器->输入->附加依赖项是否填写正确。
- 编译选项是否和编译 GLFW 库的工程保持一致。
设置相对路径(可选)
由于我要根据情况使用两台设备开发,如果我使用git或者其他云服务在另一台PC打开这个项目,之前添加的第三方库文件和头文件就会丢失,使用相对路径就能暂时解决这个问题。
我们先把之前建立的Libraries拉到项目根目录
然后更改我们之前设置的路径,由于Libraries已在根目录下,路径就可以这样写:
你也可以放在此目录的上一级,写法则是 ..\Libraries\include
。当然还要注意不要取消勾选 从父级或项目默认设置继承,否则你的项目可能找不到 C++ 的其他头文件。
确认两个路径更改完后进行编译。
项目一切正常,AWESOME!