面向 C++ 与计算机图形学入门的可运行示例集。 A collection of minimal, runnable C++ examples for learning computer graphics.
本仓库面向 具备 C 语言基础、熟悉 Python / C#,希望快速掌握 C++ 基础语法并进入计算机图形学的学习者。
每个示例都是一个可独立编译运行的最小程序,内容从语言基础逐步过渡到渲染循环骨架, 并着重介绍图形学中高频使用的 C++ 特性(引用与值语义、RAII、运算符重载、模板与特化、智能指针、多态)。
examples/ 为教程示例,mycode/ 用于存放跟随学习时自己编写的练习代码。
- 递进式示例:8 个由浅入深的 C++ 示例,每个均可单独编译运行。
- 图形学导向:覆盖图形学中最常用的语言特性,而非泛泛的语言教程。
- 手写 vec3:通过实现向量类型理解
glm等数学库的运算符重载原理。 - 渲染循环骨架:给出典型实时渲染主循环的结构,便于衔接 OpenGL / TinyRenderer 等后续内容。
- 零配置构建:同时提供 Makefile 与 CMake 两种构建方式,新增源文件会被自动纳入构建。
- 配套工具:内置零依赖的 TGA → PNG 转换脚本,便于查看软件渲染输出。
- 编辑器集成:内置 VS Code 的构建、运行与调试配置。
| 依赖 | 版本 | 说明 |
|---|---|---|
| C++ 编译器 | 支持 C++20 | GCC 11+ / Clang 14+ / MSVC 19.3+ |
| GNU Make | 任意 | 使用 Makefile 构建时需要 |
| CMake | 3.16+ | 可选,使用 CMake 构建时需要 |
| Python | 3.6+ | 可选,仅用于 tga2png.py(纯标准库,无第三方依赖) |
git clone https://github.com/Asayarr/cpp-graphics.git
cd cpp-graphics
make # 编译全部示例
make run # 编译并运行也可以使用 CMake:
cmake -B build
cmake --build buildcpp-graphics/
├── examples/ # 教程示例
│ ├── 01_hello.cpp … 08_template_specialization.cpp
│ └── multifile/ # 多文件编译示范(.h / .cpp / main.cpp)
├── mycode/ # 你自己的 C++ 练习
├── tinyrenderer/ # TinyRenderer 教程项目(见下方版权说明)
│ └── mine/ # ★ 你的 tinyrenderer 实现写在这里
├── CMakeLists.txt
├── Makefile
├── tga2png.py # TGA → PNG 转换脚本
├── setup-tinyrenderer.sh # TinyRenderer 教程项目初始化脚本
├── .vscode/ # 编辑器配置
└── README.md
| 文件 | 主题 | 主要内容 |
|---|---|---|
examples/01_hello.cpp |
基础 I/O | 编译模型、std::cout / std::cin、命名空间 |
examples/02_basics.cpp |
语言基础 | 初始化、auto、引用与指针、const、容器、范围 for、传参方式 |
examples/03_classes.cpp |
类与对象 | 构造 / 析构、成员初始化列表、RAII、运算符重载、const 成员函数 |
examples/04_vec3.cpp |
数学类型 | 手写 vec3:点积、叉积、归一化、完整运算符重载 |
examples/05_polymorphism.cpp |
资源与多态 | unique_ptr / shared_ptr、继承、虚函数、运行期多态 |
examples/06_lambdas_templates.cpp |
现代特性 | 函数模板、类模板、lambda 捕获、std::function |
examples/07_graphics_skeleton.cpp |
渲染骨架 | 典型渲染主循环结构(窗口、资源、更新、绘制) |
examples/08_template_specialization.cpp |
模板进阶 | 非类型模板参数、模板特化 —— 理解 geometry.h 的关键 |
examples/multifile/ |
多文件工程 | 头文件 / 源文件分离与编译链接流程 |
运行单个示例:
make examples/04_vec3
./examples/04_vec3make # 编译 examples/ 与 mycode/ 下全部 .cpp
make run # 编译并运行
make examples/04_vec3 # 仅编译指定文件
make mycode/<your_file> # 编译你自己的代码
make clean # 清理构建产物Makefile 会自动发现 examples/ 与 mycode/ 下的新 .cpp 文件,无需修改。
cmake -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build buildexamples/ 与 mycode/ 下的每个 .cpp 会生成一个同名可执行文件;
多文件示范生成 multifile_demo。新增文件后重新执行一次 configure 即可。
仓库内置 VS Code 配置(.vscode/):
- F5:编译并调试当前打开的源文件(GDB);
- Ctrl+Shift+B:编译全部示例;
- 任务面板中提供
build current file与run current file。
在其他环境下,可直接使用命令行:
g++ -std=c++20 -Wall -Wextra -g examples/02_basics.cpp -o /tmp/02_basics
gdb /tmp/02_basicstga2png.py 用于将 TGA 图像转换为 PNG(纯 Python 标准库实现,无需 Pillow / ImageMagick),
常用于查看软件渲染器的输出:
python3 tga2png.py framebuffer.tga # 生成 framebuffer.png
python3 tga2png.py framebuffer.tga output.png # 指定输出文件名tinyrenderer/ 是 ssloy/tinyrenderer 的源码与必要素材(参考实现),
tinyrenderer/mine/ 用于跟随教程自己编写实现:
cd tinyrenderer/mine
make run # 编译并运行
python3 ~/cpp-graphics/tga2png.py framebuffer.tga在 VS Code 中可直接使用任务 tinyrenderer: build / tinyrenderer: run,
或用调试配置「调试 tinyrenderer/mine」按 F5 单步调试。
- TinyRenderer —— 用 500 行 C++ 实现软件渲染器,理解 OpenGL 的底层机制
- LearnOpenGL —— 系统性的现代 OpenGL 教程(中文版)
- glm —— OpenGL 数学库,本仓库
04_vec3可视为其简化版 - cppreference —— C++ 标准库参考
本项目自写部分基于 MIT License 开源。
tinyrenderer/ 目录来自 ssloy/tinyrenderer,
同样基于 MIT License 发布(原始许可证见 tinyrenderer/LICENSE.txt)。
为便于跟随教程学习,本仓库仅保留了其源码与必要素材。