TRender 是一个使用 C++17 编写的教学型软件光栅化渲染器,学习过程参考 ssloy/tinyrenderer。项目从像素和直线绘制开始,逐步实现三角形光栅化、深度缓冲、相机变换、纹理与法线贴图、阴影、环境光遮蔽以及卡通渲染。
整个渲染流程由 CPU 完成,不依赖 OpenGL、DirectX 等图形 API。渲染结果保存为 TGA 图片。
| CMake 目标 | 内容 |
|---|---|
bresenham |
Bresenham 直线绘制 |
bresenham_homework |
直线绘制作业 |
Triangle |
三角形光栅化 |
Triangle_homework |
三角形光栅化作业 |
Hidden |
背面剔除与深度处理 |
Crude |
基础相机与投影 |
Crude_homework |
基础相机作业 |
Better |
LookAt、透视与视口变换 |
Shading |
基础光照与着色 |
Shading_homework |
着色作业 |
MoreData |
OBJ 属性、纹理和法线贴图 |
MoreData_homework |
Phong 光照作业 |
TangentSpaceNormalMapping |
切线空间法线贴图与 TBN 矩阵 |
ShadowMapping |
Shadow Mapping 阴影 |
Indirect |
多方向采样的环境光遮蔽与边缘检测 |
Indirect_homework |
屏幕空间环境光遮蔽(SSAO) |
BonusToonShading |
分段光照与深度描边卡通渲染 |
TRender/
├── Home/ # 公共数学、模型、图像和光栅化代码
│ ├── geometry.h # 向量与矩阵
│ ├── model.h / model.cpp # Wavefront OBJ 与纹理加载
│ ├── tgaimage.h / tgaimage.cpp # TGA 图像读写
│ └── our_gl.h / our_gl.cpp # 相机、视口、ZBuffer 和光栅化
├── Object/ # OBJ 模型及配套纹理
├── */main.cpp # 各章节示例
├── */homework.cpp # 各章节作业
├── CMakeLists.txt
└── output/ # 运行时生成的图片(Git 忽略)
- CMake 3.20 或更高版本
- 支持 C++17 的编译器,例如 Apple Clang、Clang 或 GCC
- 可选:VS Code、C/C++ 扩展和 CMake Tools 扩展
macOS 可以确认工具是否安装成功:
cmake --version
clang++ --version在项目根目录执行:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j 10只编译某个示例,例如卡通渲染:
cmake --build build --target BonusToonShading -j 10如果移动了项目目录并遇到 CMakeCache.txt directory is different,请删除旧缓存后重新配置:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release --fresh在 VS Code 中也可以执行 CMake: Delete Cache and Reconfigure。
示例代码使用类似 ../Object/... 的相对模型路径,因此应从 output/ 目录启动程序:
cd output
../build/BonusToonShading运行其他章节时替换可执行文件名即可,例如:
../build/ShadowMapping
../build/Indirect
../build/Indirect_homework程序生成的 .tga 图片会保存在 output/ 下对应的章节目录中。
OBJ 模型顶点
↓ ModelView
相机空间
↓ Perspective
裁剪空间
↓ 透视除法
NDC 坐标
↓ Viewport
屏幕坐标
↓ 三角形光栅化 + ZBuffer
片段着色
↓
TGA 图片
build/保存 CMake 构建文件,可以安全删除并重新生成。output/保存程序输出,不参与版本控制。- TGA 像素通道在代码中采用 BGRA 顺序。
- 法线、光线和顶点参与运算前应变换到同一个坐标空间。
- 项目主要用于理解渲染管线和相关数学原理,不以实时性能为目标。