一、目的以及大体内容
在写这篇文章的时候,我的软光栅已经做完了,我大概是两年前开始看虎书的,因为我还要考研,考了两次才上岸,所以这个过程我其实中断了很多次。上岸某985之后,我有了时间看完虎书,然后做一个软光栅。
这个软光栅全部用C++在CPU上跑,除了读写文件,没有任何第三方库,也就意味着做的人需要手动模拟GPU的工作并把OpenGL做的事做一遍,然后写好shader输出图片,最终我们得到的效果这样的:


从图片中可以看出,这个软光栅实现了以下功能:
- OBJ文件读取,Normal,BaseColor,AmbientLight三贴图读取和处理。其实就是UE导出的OBJ文件和三贴图的处理,但是注意,我写的软光栅不支持多级模型结构,只是简单的模型可以用,你如果模型之下还有子模型,会加大文件数据组织的复杂度(虽然文件读取本身我们使用库实现,但是读取进来的数据需要组织成我们之后使用的格式),这样就偏离写软光栅的主旨了。
- 线性代数的运算库。包括二,三,四维向量的叉积,点击,标量相乘,个元素分别相乘,模长,单位化,施密特正交化。二,三,四维方阵的转置,逆,矩阵向量乘法,矩阵矩阵乘法等。
- 投影变化。根据近大远小的原理去变化顶点数据,这部分具体原理参考同一个专栏以前的文章,那是我看虎书留下的笔记,但是那部分笔记是有错的,我也懒得改了,你如果有基础就跟着我的这个代码以及之后的文章来就好。
- 光栅化插值。这部分是GPU的工作,但是我们要用CPU模拟一遍,把颜色,法向量,uv贴图等插值到各个片元。
- shader编写。这里我采用了自己魔改的一个光照模型,高光用phong shader处理,环境光本身固定常数,漫反射我自己建立了一个简单的模型,然后让AI帮我做了能量守恒。
- 阴影实现。这本质是在跑两边渲染管线,具体内容之后再说。
我做这个软光栅是6天爆肝出来的,写这个文章的目的也是为了简历自己的技术品牌,同时帮助想要学习图形学从事游戏行业的人,因为我个人学习图形学是自己看虎书,然后一点点来的,我希望能帮助到和我一样自学但是感到实践无从下手的人,我本身是打算从事游戏行业并立志做出属于自己的奇幻动作3A的,所以如果能有人愿意和我交流再好不过。
以下是github链接:
https://github.com/getyo/TinyRender
出于学习目的我分享了自己的代码,大家可以下载下来去玩玩,其中有bug我也欢迎大家指出,但是我并不希望我的代码未经我的容许公开四处乱传,如果你非要这么做,我也没那个时间和你耗。如果有人看我的仓库就会发现,我本科自己做过内核,编译器,我也没有分享的意思,因为我能写出代码代表我懂了,再去写文章分享对我来说是一件非常得不偿失而且耗费精力和时间的事情,只是我希望建立自己的个人品牌,所以我开始从小事做起,希望大家能尊重我的劳动成果。
二、面向人群、我建议的时间安排以及更新计划
2.1 面向人群
如果你打算跟着我做这个软光栅,你不需要看完虎书,只需要大概看完Games101 即可,你知道一个大概原理就行,因为我之后会结合代码手把手带你,但是你必须懂:
- 线性代数
- 微积分
- C++基本语法和常用库
- C与指针的基本使用
也不用多么精通,不懂的话到时候上网查就行,只是我不会讲这些东西,我会默认你懂。
所以说,你如果不懂图形学但是想学,或者说对图形学一知半解但是想要实践,亦或者你在图形学某一方面已经有了经验,但是对于渲染管线没有一个自己亲手实践过的全局观,你都可以跟读这一系列文章。
2.2 我建议的时间安排
我本人做完这个东西用了六天,但是那是精力高度集中的六天,每天九个小时以上的工作,所以说,我不觉得部分基础不好的人,或者说还有其他事的人参考我这个时间安排。我觉得一个合理的安排如下:
- 2天:文件读写熟悉,组织清楚文件数据,矩阵库编写完成。
- 2天:投影完成。这部分因人而异,因为很多人如果基础薄弱会卡在矩阵变化和公式推到上,如果懂的话很快,代码量只有一百行左右。
- 3天:光栅化插值。这是整个渲染器的核心,也是我做的软光栅最不一样的地方,因为这部分都是GPU的活,我们却要用CPU跑一遍,难点和重点有:裁剪算法,双线性插值纹理映射,重心插值属性,TBN法线贴图处理,zBuffer深度缓冲。
- 1天:shader编写和图片输出。
- 1天:阴影添加。
输出的话只是png图片,我不想耗时间在做界面上,这不是我的主要目的。输入的文件资源之后我会网盘分享,你也可以自己找OBJ格式文件,然后提供baseColor,Normal,ORM三贴图。
2.3 更新计划
虽然我给自己挖了一个大坑,但我更新并不固定,先看看反响吧,好的话就继续,没人看就弃坑了,这本身也是一个尝试性的行为。主要因为我真的很难抽出空来做这个,它如果不能带给我足够的反馈那么对我来说性价比极低,本身这也不是我的主业。