一张带光照层次的非洲人像渲染图,背后没有调用一次 OpenGL、Vulkan、Metal 或 DirectX——做出这张图的,是不到500行的裸 C++ 代码,不依赖任何第三方图形库。更极端的是起点:程序一开始唯一能做的事,是把一个像素点涂成白色。这是海外一门长期开设的教学项目 Tiny Renderer(作者 ssloy)的入口,画线、画三角形、贴纹理,统统要学生自己动手写出来。

速读:从一个像素写到一张脸

  • 起点极简.框架只提供 TGA 图片的读写和单像素上色,没有现成的画线、画三角形函数。
  • 投入产出.作者说自己的学生通常10到20小时编程,就能做出一个能用的简化渲染器,最终核心代码约500行
  • 输入输出.输入是带纹理的三角网格模型,输出是一张 TGA 图片,没有窗口也没有交互,程序跑完就结束。
  • 明确划线.作者反复强调,这是软件渲染教学,目的是讲清 GPU 图形 API 背后的逻辑,不是教你写 GPU 应用;完整代码开源在 GitHub,但他不建议直接抄,自己写完才算数。
从像素到渲染:手写四步 STEP 1 单像素上色 唯一现成能力 无现成画线函数 STEP 2 手写画线 逐点插值算法 一次次调用像素 STEP 3 三角光栅化 逐像素判遮挡 手写深度测试 STEP 4 贴图渲染 带纹理三角网格 输出TGA图片

绕开黑箱,才看得清 GPU 在干什么

多数人卡在学 OpenGL、Vulkan 这类 3D API 的第一道坎上,原因很简单:一上来就是调一个函数、屏幕上出现一个三角形,中间发生了什么完全是黑箱。Tiny Renderer 反着来——不让你碰任何现成图形库,逼你把黑箱里的每一步亲手搭一遍:画线怎么插值、三角形怎么光栅化、深度测试怎么判断遮挡、纹理怎么采样上色。

老子说“合抱之木,生于毫末”,这门课基本是照这个逻辑设计的:从一个像素长到一张完整的贴图人脸,每一层复杂度都不是抽象讲出来的,是敲代码敲出来的。

抄不来的不是代码,是把黑箱拆开的那份手感。
  • 结论.等到真正打开 OpenGL 或 Vulkan 教程,顶点变换、光栅化、片元着色这些词不再是新名词,而是自己已经写过一遍的东西——这才是这门课真正想留给你的东西,那份能跑起来的500行代码只是副产品。
  • 风险.不要把这套软件渲染器当成 OpenGL、Vulkan、Metal、DirectX 的功能复刻。现代图形 API 还要处理并行调度、显存管理、着色器编译这些 CPU 软件渲染完全不涉及的问题,这里教的只是结构上的相似逻辑。
三个数字看这门课 500 最终核心代码行数 不含TGA基础类 10-20 小时编程投入 作者学生的平均经验 0 使用的第三方 图形库数量

工具越堆越厚,基础训练反而更稀缺

游戏引擎和图形框架这些年一直在往上叠抽象层,Unreal、Unity 把渲染管线包得严丝合缝,大多数开发者一辈子都不会亲眼看到光栅化是怎么发生的。这也是为什么这类“从零重写”的教学项目至今还有人愿意投入10到20小时去啃——工具越方便,愿意往下钻的人越少,能钻下去的人反而更值钱。

这门课能给的不是一份能拿出手的作品,是以后调试渲染管线时,知道问题出在哪一层、该往哪个方向查。那张非洲人像渲染图好不好看,其实不重要;重要的是画出它的人,不再对着 OpenGL 文档一脸茫然。