渲染引擎开发笔记3

代码框架

Posted Kongouuu's Blog on December 15, 2021

前言

在前两篇笔记的过程中,主要是稍微设想了一下程序的结构,并且添加了很多子系统(例如窗口)。随着代码量的增加肯定是不可以把所有的东西全部放在一起的,要把他们全都分开,不过个人去Github上参考别人的渲染引擎的时候发现每个人的手法都是比较不一样的,这边也记录一下设计代码结构的一个过程。

代码结构

大体框架

首先,因为当时考虑的是一个比较固定的引擎(DLL),并且把加载不同的物体这样的比较有自定义性功能继承出去,所以我们的代码大体结构是差不多长这个样子的:

因为这里想要做一个比较初阶的渲染引擎,所以目前还不会用到很多比较大型的子系统。基本上子系统例如LOG,IMGUI这些都是通过第三方库去加载,然后只需要一个简单的管理类就可以达成的,所以把他们全部都塞在EngineCore里面。

这部分目前还挺清晰的,然后就是Scene相关的类,例如Mesh,Model,Camera等等的数据,跟场景相关的,都应该是放在引擎侧而不是渲染器侧。因为我们理论上应该在引擎侧处理的比如说物体的变换等操作在逻辑上应该都是独立于渲染器的,渲染器只是用来表达结果的一个媒介。这里特别拿出来说因为跟着龙书学的时候其实是把所有东西揉在一起,然后针对固定场景时也是手动的去修改建立的SRV Heap。这里如果我们把Scene放开的话逻辑是通的,不过Renderer那边可能要多思考一下怎么写。

头文件

头文件这里的话有很多项目是会把头文件跟CPP文件放在一起的。把我上面的结构展开来就差不多是下面这样子的划分:

其实挺不错的,可以用,我看很多Github上别人的引擎也是类似的结构,不过很多的ThirdParty/vendor文件夹的处理都不太一样。

我没有这么做,这样不符合我的审美,具体也说不上来。

这里也没有什么特别的原因,我当时感觉把头文件也放在Source里面有点怪,虽然是没问题的。还有就是我感觉ThirdParty的部分也应该呆在Source里面,不过第三方所使用的静态链接库不应该,个人觉得静态链接库应该全部放在一个单独的文件里面。可能是看的偏Linux的代码比较多,所以最后决定使用下面的结构:

主要是让include储存所有头文件,src放所有实现。然后lib放静态库。