← 文章 / 未分类
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

评论 (0)