前言
「十天自制软渲染器」这个标题我承认标题党了。在对图形学一无所知的情况下想十天自制一个软渲染器,就好似一节课没上过却试图一个晚上看完《30 天精通 C++》然后第二天早上八点考试得满分一样,我承认世界上有这种天才,但很可惜我不是。
就像前文所说,本系列造的轮子都是站在巨人的肩膀上完成的,需要对相关知识有一定的了解和学习,如果你是一个图形学大牛,这种软渲染器肯定是不屑于做的;如果你刚刚进入图形学的大门,造一个软渲染器的轮子,非常利于你巩固自己的底层知识。
本文主要(90%)参考 ssloy 大神的 tinyrenderer 教程,零依赖实现一个软渲染器,通过这个教程可以实现一个简易版本的 OpenGL2.0
(rendering pipeline 只支持 Vertex Shader
和 Fragment Shader
两种自定义 Shader 类型),了解 OpenGL
这类图形学 API 在底层是如何工作的。
我自己造的轮子是 toyRenderer,在 tinyrenderer 的基础上加入了大量的注释并按自己的理解优化了部分代码(不排除有反向优化),如果大家对 tinyrenderer 感兴趣,可以参考一下我的实现和我现在写的这个教程,点个 star 🌟 就更好不过了~
本专栏的目录结构和 tinyrenderer 保持一致,方便大家对比阅读。
前置知识
要想看懂 tinyrenderer 的代码,需要有一定的知识储备,下面是我在造轮子时的一些总结,大家学习前可以参考一下。
1.数学
对于图形学来说,数学是一道绕不过的坎儿;对于这个软渲染器 器轮子来说,并没有涉及太多的数学内容,我个人总结如下:
1.1 高中数学
造一个软渲染器需要你还记得一些高中几何的内容,难度都不大,比如说直线的坐标公式,重心坐标等。
1.2 微积分
微积分其实只有少量的涉及,原教程里有一点点梯度的内容,个人感觉对整体学习进度影响不大。
1.3 线性代数
线性代数涉及的内容比较多,从最简单的向量,再到各种坐标系变换,都需要对线性代数有比较扎实的理解。
如果你线性代数都忘的差不多了,这里我推荐 3Blue1Brown 的教程——《线性代数的本质》,这是我见过最好的线性代数入门教程了。而且图形学里涉及的矩阵变换绝大部分都是三维空间的,基本上看完这门课就可以上手图形学的学习了。
2.图形学
图形学入门课程我只推荐一个,闫令琪大神的《GAMES101-现代计算机图形学入门》。
闫令琪大神有多厉害我就不多介绍了,最关键的是 GAMES101 优点太多了:
- 全中文讲解,大大降低国内小伙伴的学习门槛
- 课程非常新,2020 年初才开课,不会存在课程/教案过时的情况
- 知识点全面,正如课程名「现代图形学入门」,本课程不但讲了经典的光栅化成像,还讲了光线追踪等相对较新较前沿的内容
学完这门课可以收获什么呢?比如说 2077 的图形设置面板你都知道是啥意思了
如果跟着这门课学下来,其实课下作业就会完成一个小的软渲染器,但由于我是后期才加入学习的,所以作业也没有跟着做,经过搜索发现 tinyrenderer 这个教程推荐的人最多,所以最后参照这个教程实现了自己的软渲染器。