接从零开始手敲次世代游戏引擎(三十五),首先导入合并从零开始手敲次世代游戏引擎(PNG特别篇)当中所写的PNG文件解析器,然后手工编辑aili.ogex,向👀材质添加eye.png贴图。执行程序,可以看到👀已经有了。(不过我们可以发现眼睛其实只是浮在脸前方的一个片面。。。这个是建模的锅,不怪我。。。)
另外仔细观察可以发现右侧的头发(side hair)没有正确的着色。这是因为右边的头发是通过对左侧的头发进行镜像得到的。虽然在Blender里面看起来没有什么问题,但是这种镜像会导致两个问题:
- 导出的三角形顶点的旋转方向从逆时针变为顺时针,从而导致被GPU裁剪(Culling)掉;
- 导出的模型变换矩阵是下面这个样子:(以X轴镜像为例)

可以看到包括一个对X坐标去反的计算。而我们的shder里面有对于法线的这么一个计算:

其中的modelMatrix就是上面这个矩阵。这就导致法向量也被镜像,也就是出现反转。所以我们看到的就是上面屏幕录制里面那样黑漆漆的。
这个问题我们可以通过修改OGEX导出脚本来修正,或者在今后我们编写了我们的游戏引擎的Editor之后,在Editor里面修正。所以我们这里就暂时不作进一步的展开了。
好了,到这里我们对于图形渲染基本管线的搭建就暂时告一个段落。当然图形渲染是一个很深的坑,我们还有很多很多没有实现的东西,比如随便列举一些:
- 点光源之外的光源类型
- 多光源
- 阴影生成
- diffuse贴图之外的贴图,如法线贴图,位移贴图,等等
- VS和PS之外的Shader,如Geometry Shader, Compute Shader等等
- 图像后处理
在场景组织和管理方面,我们也有很多可以进一步完善的东西,如:
- 场景物体的层次结构,分组和定义在组级别的坐标变换
- 场景的异步加载
等等。但是在继续深入介绍这些东西之前,作为一个游戏引擎的运行时,我决定先进行其它几个重要模块的基本构建,比如输入模块,驱动模块,策略模块,调试辅助模块等等。
接下来说一下工程方面的进展。感谢CircleCI,在之前免费的Linux环境的基础上,为我免费提供了基于macOS的连续集成环境。现在每一个push到github上的commit,都会自动进行Linux和macOS两个版本的编译和测试用例的执行确认,如下图:

实现起来也很简单,如下面这样修改我们的circleCI的脚本即可:

确实非常方便,欢迎大家在自己的项目当中也多多尝试。再次感谢CircleCI对于OpenSource项目的大力支持!
(最近一直在生病😷,文章更新的比较慢了,请多多包涵)
最后顺便说一句,第一届中国大学生AR/VR竞赛昨天拉下帷幕。虽然大赛自身的组织有很多的仓促,但是同学们的作品真的都很棒。期待大家加入游戏开发的大家庭。