Tinyrenderer
for study GAMES101
Install / Use
/learn @LiarGs/TinyrendererREADME
TinyRender - 从零实现的软渲染器
一个基于C++17实现的现代软渲染器,支持obj模型加载、PBR材质、静态光照、实时相机控制、多线程渲染、SSAA抗锯齿及多种渲染模式。从矩阵变换到片元着色,不依赖图形API,深入理解计算机图形学核心原理。
✨ 核心功能
🎛️ 可编程渲染管线
- 顶点着色器
完整实现MVP矩阵变换与法线变换(vertex_shader函数) - 片元着色器框架
支持6种可编程着色器:- 法线可视化 (
normal_fragment_shader) - Phong光照 (
phong_fragment_shader) - 纹理映射 (
texture_fragment_shader) - 凹凸/位移贴图 (
bump/displacement_fragment_shader) - 纯色/白模渲染 (
white_fragment_shader)
- 法线可视化 (
🛠️ 依赖项
- OpenCV 4.x(渲染结果查看与保存)
- C++17兼容编译器(C++20支持的日志
Log.h)
📊 实时调试信息
- 三角形面数统计
窗口标题实时显示渲染三角面数(rasterizer::show()) - 帧率监控
画面左上角显示实时FPS(main.cpp中的帧计时逻辑)
📦 模型与材质系统
- OBJ模型加载
支持带UV和法线的OBJ模型解析(见OBJ_Loader.cpp) - PBR材质管线
实现环境光/漫反射/镜面反射贴图(Materials.h中金属、皮肤、玻璃等材质)可自定义添加材质 - 纹理映射
UV采样与透视校正(Texture.cpp)
💡 光照与着色
- Phong光照模型
完整实现环境/漫反射/镜面反射分量(phong_fragment_shader) - 法线/位移贴图
TBN矩阵变换实现凹凸效果(bump/displacement_fragment_shader) - 多光源支持
点光源衰减与强度计算(Shader.cpp中的光照累加)
🎥 交互式相机
- 轨道控制器
鼠标拖拽旋转/右键平移/滚轮缩放(OrbitCamera.h实现) - 透视投影
可调FOV和裁剪平面(rasterizer.cpp中的投影矩阵) - 模型变换
支持模型平移/旋转/缩放组合变换(set_model方法)

🖌️ 多样化渲染
- 多模式切换
F键面渲染/E键线框模式/V键顶点模式(rasterizer.cpp渲染管线) - 抗锯齿方案
4x SSAA超级采样(注释部分可启用)

🛠️ 交互控制
| 按键 | 功能 | | ------------ | ------------ | | 鼠标左键拖拽 | 旋转模型 | | 鼠标右键拖拽 | 平移场景 | | 滚轮 | 缩放相机 | | E/F/V | 切换渲染模式 | | M | 切换多渲染 | | A | 切换SSAA渲染 | | ↑/↓ | 切换片着色器 | | ←/→ | 切换模型 |
🚀 性能优化
- 包围盒剪裁:三角形快速剔除(
getBoundingBox) - 背面剔除:背面三角形渲染优化(有向三角形面积
double_area2D管理)
📚 实现亮点
- 自定义矩阵向量类:矩阵运算向量化(
Vec.h模板类) - 可编程片着色器:自定义片着色器(
Shader.cpp) - 透视校正:深度感知的重心坐标插值(
rasterize_triangle) - 材质系统:基于物理的反射率计算(
Material结构体)
📸 效果展示
| 着色器切换 | 模型展示 |
|-----------|---------|
|法线可视化|
|
|Phong光照|
|
|纹理映射|
|
|凹凸贴图|
|
|位移渲染|
|
|白模渲染|
|
🌟 未来计划
- [ ] 阴影映射
- [ ] 延迟渲染管线
- [ ] GPU加速计算
🚧 项目持续开发中,欢迎提交Issue和PR!
Related Skills
node-connect
351.4kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
110.7kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
351.4kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
351.4kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
