作为OpenGL核心渲染模式的开篇,如果一上来就来一个Hello OpenGL,岂不是很懵逼?!环境都没配搞什么Hello OpenGL。众所周知,OpenGL是一个跨平台的可编程的三维图形库,那么其跨平台的特性就离不开一些主要的第三库的支持。或许你已经接触过一些OpenGL的基础知识,想必对以下的一些库已经有所了解:

  • glut
  • freeglut
  • glfw
  • glew
  • glad
  • glm
  • assimp
  • stb_image
  • FreeImage
    等等等等。
    如果已经被扫盲的孩子请跳过,此篇文章不适合您阅读,请直行。
    如果您对这方面的知识感兴趣,那么请继续阅读。

1 OpenGL第三方库的主要作用

OpenGL从某种意义上来讲,是一个被公共定义的显卡API集合,各家显卡厂商根据一个设计好的接口规范对各个接口函数进行实现,从而达到一个API接口函数可以在不同架构不同厂商的显卡上运行并取得高质量的表现。

1.1 窗口与交互

由于目前操作系统的多样性,导致了OpenGL需要同时对多个操作系统的绘制图形的外部窗口进行支持,并同时支持鼠标键盘对绘制图形窗口的交互,从而实现场景漫游等等具有交互式行为的操作。例如glut、freeglut、glfw就实现了此种功能。

1.2 API更新迭代

目前,OpenGL为了实现与Dirext3D的对抗,版本迭代的速度越来越快,在多数版本更新的情况下会更新新的API接口函数,那么用户操作系统内置的OpenGL版本往往更不上更新的速度,导致一些新版本的API不能被很好的使用,所以这个时候,你只需包含一个跨平台的第三方库就可以使用目前OpenGL最新版本的所有API。例如glew、glad就实现了这种功能。

1.3 数学变换与操作

OpenGL作为三维图形学的渲染利器,自然少不了复杂的数学操作,比如说矩阵变换,旋转变换,位移变换等等。我们没有那么多的时间去造这种通用的轮子,因为已经有神帮你造好了。例如glm就实现了这种功能。

1.4 资源加载

在OpenGL实现三维模型浏览就需要加载三维模型资源;在OpenGL实现贴图就需要先把纹理加载进内存资源;在OpenGL实现音乐播放就需要加载音频.....

2 OpenGL比较火热的第三方库

2.1 OpenGL与窗口有关的第三方库

2.1.1 glut

官网:https://www.opengl.org/resources/libraries/glut/

GLUT(以及由此而来的freeglut)负责创建窗口,初始化OpenGL上下文以及处理输入事件所需的所有系统特定的杂务,以允许可移植的OpenGL程序。只支持32位,并且有内存泄漏风险。

2.1.2 freeglut

官网:http://freeglut.sourceforge.net/

freeglut实际上是对glut的百分百替代,并且执行64位编译。

2.1.3 glfw

官网:https://www.glfw.org/

GLFW是一个用于台式机上的OpenGL,OpenGL ES和Vulkan开发的开源,多平台库。 它提供了一个简单的API,用于创建窗口,上下文和表面,接收输入和事件。

2.2 OpenGL与OpenGLAPI有关的第三方库

2.2.1 glew

官网:http://glew.sourceforge.net/

glew是跨平台的开源C/C++扩展加载库,glew提供了有效的运行时机制,用于确定目标平台上支持哪些OpenGL扩展。不同的显卡公司,也会发布一些只有自家显卡才支 持的扩展函数,你要想用这数涵数,不得不去寻找最新的glext.h,有了GLEW扩展库,你就再也不用为找不到函数的接口而烦恼,因为GLEW能自动识别你的平台所支持的全部OpenGL高级扩展函数。也就是说,只要包含一个glew.h头文件,你就能使用gl,glu,glext,wgl,glx的全部函数。

2.2.2 glad

官网:https://glad.dav1d.de/

GLAD是继GL3W,GLEW之后,当前最新的用来访问OpenGL规范接口的第三方库,作用大致与glew相同。

2.3 OpenGL数学运算第三方库

2.3.1 glm

官网:https://glm.g-truc.net/

OpenGL Mathematics(GLM)是基于OpenGL Shading language(GLSL)规范的只有头文件的数学库。GLM提供了使用与GLSL相同的命名约定和功能设计和实现的类和函数。基于GLSL扩展约定的扩展系统提供了扩展功能:矩阵变换,四元数,数据打包,随机数,噪声等。该库可与OpenGL完美配合,但也可确保与其他第三方库和SDK的互操作性。它是软件渲染(光线跟踪/光栅化),图像处理,物理模拟以及任何需要简单方便的数学库的开发环境的理想选择。GLM用C ++ 98编写,但是在编译器支持的情况下可以利用C ++ 11。它是一个不依赖平台的独立库,没有任何依赖关系。

2.3.2 Eigen

官网:http://eigen.tuxfamily.org/index.php?title=Main_Page

Eigen是用于线性代数的C ++模板库:矩阵,向量,数值求解器和相关算法。

2.4 OpenGL模型加载第三方库

2.4.1 Assimp

官网:http://assimp.sourceforge.net/lib_html/
Github:https://github.com/assimp/assimp

assimp是一个用于从各种数据格式加载和处理几何场景的库。 该库不是为了提高速度而设计的,它主要用于加载与导入各种格式的三维模型文件,并将其转化为assimp特定的数据结构,并且这种数据结构非常容易被使用。 assimp还能够对导入的数据应用各种后处理步骤,例如转换为索引网格,计算法线或切线/切线或从右手坐标系转换为左手坐标系。

2.5 OpenGL纹理贴图加载第三方库

2.5.1 stb_image.h

Github:https://github.com/nothings/stb

极简的图片文件加载头文件,一个头文件就支持加载多种格式图片文件。

2.5.2 FreeImage

官网:https://freeimage.sourceforge.io/

FreeImage是一个开源库项目,面向希望支持当今多媒体应用程序所需的流行图形图像格式(如PNG,BMP,JPEG,TIFF和其他格式)的开发人员。 FreeImage易于使用,快速,多线程安全,与所有32位或64位版本的Windows兼容以及跨平台(适用于Linux和Mac OS X)。

3 如何合理搭配OpenGL的第三方库

  • 如果你以前经常使用OpenGL立即渲染模式也就是OpenGL3.3之前版本的,没有进行过shader编程过的同学,想进行OpenGL核心模式的学习,那么freeglut中关于窗口与交互操作的API可以作为你的首选,当然你必须从glew和glad中选一个来访问OpenGL新的规范接口。其中freeglut用于管理渲染窗口与交互,glew或glad负责新规范接口的访问。
  • 如果你是刚接触OpenGL的,那么从新的glfw+glew或者glfw+glad开始是一个不错的选择,反正都要从头开始,何不上最新的呢?其中glfw用于管理渲染窗口与交互,glew或glad负责新规范接口的访问。
  • 我的建议:如果可以的话,可以尝试glfw+glad的搭配。

作为OpenGL可编程渲染管线的一血,希望能够使大家对OpenGL这么多第三方库的大致的了解与认识。