文章

TinyRenderer(零):从零开始实现一个软渲染器

实现软渲染器并不难,相关方面的视频、博客教程也非常多,国内最好的课程应该是闫令琪老师的GAMES101: 现代计算机图形学入门课程,细致地讲解了从三维模型到二维图像的数学过程,也提供了与课程匹配的编程作业,理论与实践结合,代码量不大,非常适合图形学入门。此外也有精品文字课程如tinyrendererScratchapixel,号称只用数百行C++代码实现软渲染器,短小精悍容易上手,缺点都是过于简陋,没有酷炫的图形界面。为此,大概两年前我在业余时间(指上班摸鱼)写了一个简单的软件光栅化渲染器,实现了部分tinyrenderer的算法,同时加入图形界面库实时显示渲染结果,用可视化的结果增加编码的趣味性。项目也命名为TinyRender,T和R均大写用以区别tinyrenderer(后面用tr和TR区分两个项目),GitHub地址为https://github.com/MicroYY/TinyRenderer。下面为TinyRenderer的运行截图。

image.png

尽管看起来运行结果正常,但TinyRender的透视投影结果其实有一个错误的旋转,而正交投影的结果则是完全不对。由于时间过去许久,我对算法和代码细节的记忆都已模糊,竟然对于修复bug无能为力。所以决定开一个系列文章介绍软光栅化渲染的过程,回顾算法的同时尝试修复这些bug,也是对学习过程的记录。TinyRender只实现了基本的坐标变换、光栅化、纹理映射,许多进阶的特性没有添加,后续也会逐渐实现更多的功能。

本文由作者按照 CC BY 4.0 进行授权