/TheSloppyWorld

A progressive repo building an entry-level roaming scene using Qt6 and OpenGL.

Primary LanguageC++MIT LicenseMIT

The Sloppy World

写在前头

TheSloppyWorld 是一个用于入门 Modern OpenGL 的仓库。

在 TheSloppyWorld 中,分别使用 Qt6 和 Eigen 用于 OpenGL 的前端与数学计算。不过很显然,使用什么样的前端与数学库并不会对 OpenGL 的学习产生太大的干扰。毕竟 OpenGL 的呈现最终还是通过其 API 调用实现的,而如何与这些 API 打好交道也是学习的主要内容之一。

出于实用性考虑,本仓库中并不会对 OpenGL 的细节原理(细节原理≠细节)进行过分探究。在仓库中,入门过程通过一个个的样例呈现,而这些样例都借助工厂方法整合到了命令行中。

为了启动一个样例,你可以如下操作:

./TheSloppyWorld -t sampleId

鉴于部分原因(懒),并没有在命令行中整合罗列当前可用样例的功能,但是具体的样例名称可以在工厂 /src/OpenGLSampleFactory.cpp 中查看。

同样,你也可以自行实现新的样例并在工厂中拓展。

在项目的最后,基于对所有样例的实现,TheSloppyWorld 将给出它的本体 TheSloppyWorld ——一个较为完善的但是入门级且有点呆的漫游场景(笑)。

TheSloppyWorld 并不会作为一个样例存在,但是你可以使用不带参数的命令行来呈现它。

关于各样例

SinglePoint

《道德经》说:“一生二,二生三,三生万物”,那学习 OpenGL 从画一个点开始自然也没什么问题吧?

在已经“淘汰”的古老 OpenGL 中,画一个点简直不要太简单。

但是,这里是 Modern OpenGL,所以就要整点现代的玩意(没事找事)。

需要注意的是,这样做大概率是要被骂的,但是又有谁学习 OpenGL 的最终目标是为了画个点呢?所以从此开始完全没问题。

涉及知识如下:

  • 缓冲对象的概念及创建与删除
  • 缓冲对象传输数据的方法
  • 顶点属性的概念与使用
  • 使用顶点数组缓冲对象 VBO 进行绘制的最简流程

SingleTriangle

你看吧,画完点就能画三角形了!

涉及知识如下:

  • 绘制模式的差异

TriangleWithShader

Modern OpenGL 怎么可能少得了着色器呢?莫得着色器莫得灵魂!

不过话虽这么说,但其实即便“不提供”着色器,人家还是有灵魂的。只是用的是默认着色器而已。

所以上面的话得改一改:Modern OpenGL 怎么可能少得了折腾着色器呢?不折腾莫得灵魂!

涉及知识如下:

  • 着色器语言 GLSL
  • OpenGL 当前状态的获取
  • 着色器对象的分类
  • 着色器程序与着色器对象之间的关系
  • 着色器程序的编译、链接、启用流程
  • 着色器程序的作用范围

TriangleWithShaderAndRuntimeAttrib

还记得 SinglePoint 的顶点属性吗?现在不难知道其实那是作用于着色器的东西。假设使用的着色器(GLSL 程序)与应用程序分离的话,这时候再硬编码顶点属性位置就不太合理了。所以……

涉及知识如下:

  • AttribLocation 的动态应用

IndexDrawing

样例如其名,使用索引绘制。

什么,你问这个样例有什么意义?那不妨问问自己索引有什么意义。

涉及知识如下:

  • 索引数组缓冲对象 IBO 的概念与使用
  • IBO 与 VBO 的关联
  • 使用索引数组缓冲对象 IBO 进行绘制的最简流程

ClumsyScene

你可能发现 ClumsyScene 对应的源代码的文件名和其他的不太一样——没有 Sample 后缀!

哦,那可能是因为 ClumsyScene 和之前的样例相比差不多是升维了,所以换个命名格式也没大碍吧?(笑)

同时,从该样例开始,正式进入了 3D 的范畴。

因为在样例中加入了交互,所以就不可能像之前的样例那样细细给出各个值的含义了,不然那也太肥了!

故而,在简化代码的同时也对相关功能进行了一定的封装,意思表达到位即为胜利!

涉及知识如下:

  • OpenGL 的坐标系与其变换流程
  • 投影变换矩阵的构建
  • GLSL uniform 一致变量的使用
  • 缓冲对象数据的更新方法

实话实说,其实上面对应的代码量其实不多,程序的大部分都是在处理交互逻辑。

不过,人机交互逻辑又不属于 OpenGL 的范畴,所以我不写有问题吗?没有问题!

BetterScene

如其名:比笨拙的场景 ClumsyScene 更好的场景!

加入了更多的交互与视觉效果!但是大面积的代码依旧跟 OpenGL 无关!(笑)

虽然但是,这一样例的知识还是挺丰富的!

涉及知识如下:

  • 片元的正背面判定规则
  • 深度测试的概念与使用
  • 裁剪的概念与使用
  • 多着色器的使用与管理
  • 多重采样的效果与使用
  • 天空盒的实质、原理与使用