七、OpenGL常用开发库

Posted by 卢小胖 on 2023-10-06
Estimated Reading Time 4 Minutes
Words 1.3k In Total
Viewed Times

开发前提

之前在LearnOpenGL上学习是使用Visual Studio2022开发的,现在需要整理一套开发工具类和基础框架,所以打算换用Clion+Cmake的方式,以下所有编译链接都是基于Cmake, 环境是CLion + MinGW

基础工具库

首先在Clion中创建一个基础的C++项目OpenGL-Tools,在其根目录下新建文件夹:

  • include 用来存放三方库的头文件
  • libs 用来存放三方库的动态、静态库文件
  • src 用来存放三方库源文件

1. GLFW

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

这里建议直接下载预编译文件,包含了多种编译环境,我们使用的是MinGW。

链接:

  • 将glfw下的include文件内容(GLFW文件夹)拷贝到项目include中
  • lib-mingw-w64下的glfw3.dll拷贝到项目libs目录

在CmakeLists中新增:

INCLUDE_DIRECTORIES(include)
link_directories(libs)
target_link_libraries(OpenGL_Tools ${PROJECT_SOURCE_DIR}/libs/glfw3.dll)

如果在运行可执行文件时遇到报错缺少dll,可以将对于dll拷贝到系统目录,或者拷贝到程序生成目录,参考:https://blog.csdn.net/FlushHip/article/details/114677794

2. GLAD

OpenGL的API大部分在运行时动态获取,通过函数指针调用,类似:

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

这样子就很麻烦,好在有GLAD这个工具库帮我整理了函数API

一般通过在线下载,我们通过如下配置后,再点击生产,就会出现一个代码下载页,下载glad.zip压缩文件就可。

image.png

gl版本选择最新的,Profile选择Core模式

解压后将其include和src复制到项目对应根目录

CmakeLists中也要加上glad.c文件

add_executable(OpenGL_Tools
main.cpp
src/glad.c
)

3. GLM

OpenGL没有自带任何的矩阵和向量知识,所以我们必须定义自己的数学类和函数。在教程中我们更希望抽象所有的数学细节,使用已经做好了的数学库。幸运的是,有个易于使用,专门为OpenGL量身定做的数学库,那就是GLM。

GLM是OpenGL Mathematics的缩写,它是一个只有头文件的库,也就是说我们只需包含对应的头文件就行了,不用链接和编译。GLM可以在它们的网站上下载。把头文件的根目录复制到你的includes文件夹,然后你就可以使用这个库了。

下载完之后将glm放到include文件夹就行

GLM的大部分功能都在以下头文件:

#include <glm/glm.hpp> 
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

4. Assimp

在OpenGL中加载复杂的模型,肯定不是靠手撸数据,一般是通过3D建模软件创建,这些模型有不同的格式,比如:STL/OBJ等等

我们需要一个三方库解析这个模型文件,然后创建OpenGL渲染所需要的对象数据。

一个非常流行的模型导入库是Assimp,它是Open Asset Import Library(开放的资产导入库)的缩写。Assimp能够导入很多种不同的模型文件格式(并也能够导出部分的格式),它会将所有的模型数据加载至Assimp的通用数据结构中。当Assimp加载完模型之后,我们就能够从Assimp的数据结构中提取我们所需的所有数据了。由于Assimp的数据结构保持不变,不论导入的是什么种类的文件格式,它都能够将我们从这些不同的文件格式中抽象出来,用同一种方式访问我们需要的数据。

Assimp开源下载地址:https://github.com/assimp/assimp/releases

Assimp需要自己使用Cmake编译,参考:https://blog.csdn.net/lady_killer9/article/details/89429092

编译完成后将:

  • Assimp源文件的include目录下的文件,拷贝到项目include中
  • 编译生产的assimp-vc143-mtd.dll拷贝到项目libs中

5. Qt环境

Qt原生是支持OpenGL的,并且进行了封装,是不需要GLFW/GLAD这些库的,如果不熟悉Qt可以使用上面的库进行学习

因为为了方便管理功能,我觉得还是需要一些ui进行功能整理,所以接下来我们介绍Qt开发OpenGL的情况。

关于Clion配置Qt开发环境,可以参考我之前的文章:
Clion配置Qt+Cmake开发环境

5.1 Qt OpenGL示例

在QtCreator中查找Qt官方示例:
image.png

Qt对OpenGL的支持还比较丰富,无论是在界面中嵌套还是单独开启OpenGL窗口都是可行的。

这里不详细写了,很多博客都有讲过,注意的是要在CmakeLists中引入OpenGL

find_package(Qt6 COMPONENTS  
Core
Gui
Widgets
OpenGLWidgets
REQUIRED)


target_link_libraries(
OpenGL_Tools
Qt::Core
Qt::Gui
Qt::OpenGLWidgets
Qt::OpenGL
Qt::Widgets
)