用500行纯C++实现软件渲染
摘要
本教程系列教你如何用500行C++从头编写一个软件渲染器,并解释现代3D图形API的内部工作原理。
<p><a href="https://lobste.rs/s/p4xo2i/software_rendering_500_lines_bare_c">评论</a></p>
查看缓存全文
缓存时间: 2026/07/24 04:59
# 首页 - 玩转代码
Source: https://haqr.eu/tinyrenderer/
## 在500行纯C++中实现软件渲染
在本系列文章中,我旨在通过从零编写一个简化的克隆来展示OpenGL、Vulkan、Metal和DirectX的工作原理。令人惊讶的是,许多人在学习3D图形API的第一步时就遇到了困难。为了帮助解决这个问题,我准备了一系列简短的讲座,之后我的学生就能制作出功能相当不错的渲染器。
任务如下:不使用任何第三方库(尤其是与图形相关的库),我们将生成如下图像:
*警告:这是一份培训材料,它大致遵循现代3D图形库的结构。它是一个**软件渲染器**。**我并不打算展示如何编写GPU应用程序——我想展示它们是如何工作的。**我坚信理解这一点对于使用3D库编写高效应用程序至关重要。*
## 起点
最终代码大约有500行。我的学生通常需要10到20小时的编程时间才能开始制作这样的渲染器。输入是一个由三角网格和纹理组成的3D模型。输出是一个渲染图像。没有图形界面,程序只是生成一个图像。
为了最小化外部依赖,我为学生提供了一个用于处理TGA (http://en.wikipedia.org/wiki/Truevision_TGA)文件的单一类——这是支持RGB、RGBA和灰度图像的最简单格式之一。这是我们图像处理的基础。一开始,唯一可用的功能(除了加载和保存图像)是设置单个像素的颜色。
没有内置的函数用于绘制线段或三角形——我们将手动实现所有功能。虽然我提供了我自己的源代码(与学生们一起编写的),但我不建议直接使用它,因为亲自完成工作对于理解概念至关重要。完整代码可在github (https://github.com/ssloy/tinyrenderer)上获取,我提供给学生的初始源代码可以在这里 (https://github.com/ssloy/tinyrenderer/tree/706b2dfecff65daeb93de568ee2c2bd87f277860)找到。看,这是起点:
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`。
## 预告:用该渲染器制作的几个示例
---
### 评论
相似文章
用500行纯C++实现软件渲染
一个教程系列,通过用500行C++从零构建软件渲染器(无需外部库),演示OpenGL、Vulkan、Metal和DirectX的工作原理。
周末掌握3D Gaussian Splatting
一篇使用C++和OpenGL从零构建简化版3D Gaussian Splatting渲染器的教程,涵盖加载和渲染Gaussian splats。
成为图形程序员需要学习什么
一篇博客文章,概述了成为实时图形程序员所需的技能,涵盖现代渲染API、路径追踪、基于物理的渲染以及机器学习在游戏开发中的作用。
WebGPU实战教程
一本免费的互动书籍,教授使用JavaScript和WebGPU进行图形编程,涵盖从基础到高级主题,如GPU计算和高斯泼溅(Gaussian splatting)。
为微型掌机打造微型3D渲染器
一位开发者分享了他们为Playdate掌机构建3D软件渲染器的经验,从raycaster基准测试开始,讨论了性能挑战以及与复古游戏机的比较。