Software Rasterizer
TinyRenderer · CPU 软件光栅器
一个用 C++20 实现的学习型 CPU 软件渲染器,从 OBJ 模型解析开始,完成 MVP 变换、近裁剪、三角形光栅化、Z-buffer、1/w 透视正确插值、纹理采样和 Blinn–Phong 光照。
- 语言
- C++20
- 渲染方式
- CPU 离线光栅化
- 输出
- BMP 图像
Overview
项目简介
这个项目沿着 TinyRenderer 的教学路线,从读取 OBJ 顶点、纹理坐标和面片开始,逐步把模型变换、裁剪、光栅化、深度测试与着色串成一条可运行的 CPU 渲染管线。
页面中的 Dragon 转台和阶段图均来自项目的真实离线输出。它是一项以理解渲染流程为目标的练习,不把教程中的方法包装成原创算法,也不以实时性或性能数据作为成果。
Results
真实结果展示
Dragon 角度转台
拖动滑杆查看每隔 30° 输出的一帧;也可以聚焦滑杆后使用方向键逐帧切换。
线框阶段
读取 OBJ 面片后,先用直线算法验证模型拓扑与屏幕映射。
三角形填充
使用重心坐标判断像素是否位于三角形内;此阶段尚未处理遮挡。
Z-buffer
逐像素比较深度后,错误遮挡伪影得到修正。
纹理人头
对纹理坐标进行插值和采样,得到完整的纹理映射结果。
更多 OBJ 模型
使用同一条 CPU 管线加载并渲染另一份 OBJ 模型。
Implementation
实现亮点
从模型到屏幕
解析 OBJ 数据,依次应用 Model、View、Projection 与 viewport 变换,并在齐次空间执行近裁剪。
光栅化与可见性
用重心坐标遍历三角形覆盖像素,通过 Z-buffer 保留离相机更近的片元。
插值与着色
使用 1/w 进行透视正确属性插值,完成纹理采样与 Blinn–Phong 光照计算。
Current Scope
当前范围
- 当前使用固定视图矩阵(View 为单位矩阵),相机位置不提供交互式控制。
- 目前只实现近裁剪,没有实现完整的六平面视锥裁剪。
- 当前采用离线 BMP 输出,不提供实时窗口、自由相机或实时预览。
- 项目没有记录统一硬件与参数下的 benchmark,因此页面不展示性能数据。
Sources & Notes
参考与相关文章
参考资料
- TinyRenderer 教程与源码
教学路线、算法讲解与示例实现的主要参考。
- TinyRenderer 示例模型与纹理
African head 阶段图使用教程仓库提供的示例素材;当前项目未记录 Dragon 文件的原始下载来源,因此不作额外归属声明。