Hacker News 2026/7/24 · 2026-07-24 01:31:59 · 41 阅读
500行C++代码带你手写软件渲染器
在这系列文章中,我将通过从零编写一个简化版渲染器,来揭示 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 = 64;
constexpr int = 64;
TGAImage framebuffer(width,, TGAImage::RGB);
int ax = 7, ay = 3;
int bx = 12, by = 37;
int = 62, = 53;
framebuffer.set(ax, ay, white);
framebuffer.set(bx, by, white);
framebuffer.set(cx,, 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 文件中。
效果预览:渲染器生成的一些示例




评论
原始来源: Hacker News