用500行纯C代码实现软件渲染展示3D图形API工作原理附代码与示例在这一系列文章里打算通过从头编写简化版克隆程序展示OpenGL、Vulkan、Metal和DirectX的工作原理。很多人学3D图形API会卡在入门阶段为此准备简短系列讲座讲座后学生能做出功能不错的渲染器。任务目标不使用任何第三方库尤其是图形相关库生成一张如下所示的图像需要注意这是一份教学材料大致遵循现代3D图形库结构是个软件渲染器并不打算展示如何编写GPU应用程序而是展示其工作原理。理解这一点对用3D库编写高效应用程序很重要。起点最终代码约500行学生通常花10到20个小时编程才能开始制作这样的渲染器。输入是由三角网格和纹理组成的3D模型输出是渲染后的图像程序无图形界面仅简单生成一张图片。为减少外部依赖给学生提供处理 TGA 文件的类。TGA是支持RGB、RGBA和灰度图像的简单格式之一是图像操作的基础。一开始除加载和保存图像外唯一可用功能是设置单个像素颜色。没有内置绘制线段或三角形的函数将手动实现所有功能。虽会和学生一起编写源代码但不建议直接使用亲自动手实践对理解概念很重要。完整代码可在 GitHub 上找到给学生的初始源代码可在 这里 找到。下面是起点代码main.cpp#include tgaimage.h constexpr TGAColor white {255, 255, 255, 255}; // 注意BGRA 顺序 constexpr TGAColor green { 0, 255, 0, 255}; constexpr TGAColor red { 0, 0, 255, 255}; constexpr TGAColor blue {255, 128, 64, 255}; constexpr TGAColor yellow { 0, 200, 255, 255}; int main(int argc, char** argv) { constexpr int width 64; constexpr int height 64; TGAImage framebuffer(width, height, TGAImage::RGB); int ax 7, ay 3; int bx 12, by 37; int cx 62, cy 53; framebuffer.set(ax, ay, white); framebuffer.set(bx, by, white); framebuffer.set(cx, cy, white); framebuffer.write_tga_file(framebuffer.tga); return 0; }这段代码会生成一个64x64的图像 framebuffer.tga为便于阅读对其进行了缩放编译git clone https://github.com/ssloy/tinyrenderer.git cd tinyrenderer cmake -Bbuild cmake --build build -j build/tinyrenderer obj/diablo3_pose/diablo3_pose.obj obj/floor.obj渲染后的图像会保存为 framebuffer.tga。预览渲染器生成的几个示例评论使用 Material for MkDocs 制作导航目录主页tinyrenderer主页布雷森汉姆直线绘制算法三角形光栅化重心坐标隐藏面消除简易相机处理优化相机着色更多数据切线空间阴影映射环境光遮蔽额外内容卡通着色后记tinycompiler主页抽象语法树SLY词法分析器和语法分析器符号表显示汇编代码生成自制词法分析器自制语法分析器后记tinyoptimizer主页mem2regtinyfloat主页计算机与数字浮点数打印加法与误差除法香蕉投掷项目主页猿猴计算秒数猿猴买了块更好的手表猿猴没碰到地面猿猴从错误中学习猿猴击中目标猿猴扔得更远懒惰的猿猴丛林起风了猿猴了解丛林法则两秒之间事情发生了奇闻趣事诅咒之火或 #define 黑魔法门多西诺电机与恩绍定理