返回

文章详情

用500行裸C++进行软件渲染

Hacker News2026年7月23日 14:17

用500行裸C++进行软件渲染 在这一系列文章中,我旨在通过从头编写一个简化的克隆,展示OpenGL、Vulkan、Metal和DirectX是如何工作的。令人惊讶的是,许多人在学习3D图形API的初始障碍上感到挣扎。为此,我准备了一系列简短的讲座,之后我的学生能够制作出相当出色的渲染器。任务如下:在不使用任何第三方库(尤其是与图形相关的库)的情况下,我们将生成如下图像: 警告:这是一个培训材料,松散地遵循现代3D图形库的结构。它是一个软件渲染器。我并不打算展示如何编写GPU应用程序——我想展示它们的工作原理。我坚信,理解这一点对于使用3D库编写高效应用程序至关重要。 起始点 最终代码由约500行组成。我的学生通常需要10到20小时的编程时间才能开始制作这样的渲染器。输入是一个由三角形网格和纹理组成的3D模型。输出是一个渲染结果。没有图形界面,程序只是生成一幅图像。为了最小化外部依赖,我为我的学生提供一个用于处理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中。 预告:使用渲染器制作的几个示例

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡