Hacker News 2天前 · 2026-07-24 01:31:59 · 21 阅读
500行纯C++实现软件渲染器
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