162 lines
4.2 KiB
Markdown
162 lines
4.2 KiB
Markdown
# CPU Software Renderer
|
||
|
||
一个基于 C++20 和 SDL2 的 CPU 软光栅化练习项目。
|
||
|
||
这个仓库当前还处在早期阶段,重点不是调用现成图形 API 画三角形,而是自己维护帧缓冲、自己做基础光栅化,并逐步搭起一个小型 software renderer 的骨架。
|
||
|
||
## 当前状态
|
||
|
||
目前已经完成或具备雏形的部分:
|
||
|
||
- 使用 SDL2 创建窗口、纹理和显示循环
|
||
- 在 CPU 侧维护 `FrameBuffer`
|
||
- 像素写入接口 `set_pixel`
|
||
- 基础直线光栅化模块 `Rasterizer`
|
||
- 2D 三角形、包围盒、颜色等基础数据结构
|
||
- 独立的 `TriangleRasterizer` 模块,用于后续填充三角形
|
||
|
||
当前 `main.cpp` 主要用于验证基础链路,程序启动后会在窗口中绘制三条彩色线段组成的三角形轮廓。
|
||
|
||
还没有完成的核心能力:
|
||
|
||
- 完整接入实心三角形渲染流程
|
||
- MVP 变换
|
||
- 深度测试
|
||
- 重心坐标插值
|
||
- 光照
|
||
- OBJ 加载
|
||
- 可交互相机
|
||
|
||
## 当前结构
|
||
|
||
```text
|
||
CPU-Software-Renderer/
|
||
├─ CPU-Software-Renderer/
|
||
│ ├─ main.cpp
|
||
│ ├─ Core/
|
||
│ │ ├─ FrameBuffer.h/.cpp
|
||
│ │ ├─ DepthBuffer.h/.cpp
|
||
│ │ └─ Renderer.h/.cpp
|
||
│ ├─ Math/
|
||
│ │ ├─ Vector2.h
|
||
│ │ ├─ Vector3.h
|
||
│ │ ├─ Vector4.h
|
||
│ │ ├─ Matrix4x4.h
|
||
│ │ └─ MathUtil.h
|
||
│ ├─ RenderData/
|
||
│ │ ├─ Color.h
|
||
│ │ ├─ BoundingBox.h
|
||
│ │ └─ Triangle.h
|
||
│ ├─ Rasterizer/
|
||
│ │ ├─ Rasterizer.h/.cpp
|
||
│ │ └─ TriangleRasterizer.h/.cpp
|
||
│ ├─ Scene/
|
||
│ │ ├─ Vertex.h
|
||
│ │ ├─ Mesh.h
|
||
│ │ ├─ Transform.h
|
||
│ │ ├─ Model.h
|
||
│ │ └─ Camera.h
|
||
│ ├─ Asset/
|
||
│ │ └─ ObjLoader.h/.cpp
|
||
│ ├─ Shading/
|
||
│ │ ├─ ShaderTypes.h
|
||
│ │ └─ BlinnPhongShader.h/.cpp
|
||
│ ├─ libs/SDL2/
|
||
│ └─ TODO.md
|
||
└─ README.md
|
||
```
|
||
|
||
## 模块说明
|
||
|
||
### Core
|
||
|
||
- `FrameBuffer`:管理 CPU 侧颜色缓冲
|
||
- `DepthBuffer`:为后续深度测试预留
|
||
- `Renderer`:为后续统一调度渲染流程预留
|
||
|
||
### Math
|
||
|
||
- 放通用数学类型
|
||
- 当前以 `Vector2`、`Vector2Int`、`Vector3` 为主
|
||
- `Vector4` 和 `Matrix4x4` 目前还是占位
|
||
|
||
### RenderData
|
||
|
||
- 放渲染领域数据,而不是底层数学类型
|
||
- 当前包含 `Color`、`BoundingBox2D`、`Triangle2D`
|
||
|
||
### Rasterizer
|
||
|
||
- `Rasterizer`:负责基础线段光栅化
|
||
- `TriangleRasterizer`:负责三角形填充相关逻辑
|
||
|
||
### Scene / Asset / Shading
|
||
|
||
这些目录已经预留出来了,方便后面扩展到 3D 渲染流程,但当前多数还是占位类。
|
||
|
||
## 构建环境
|
||
|
||
- Windows
|
||
- Visual Studio 2022
|
||
- MSVC
|
||
- C++20
|
||
- SDL2
|
||
|
||
工程文件是 Visual Studio 的 `.vcxproj`。
|
||
|
||
## 依赖
|
||
|
||
仓库内已经包含 SDL2:
|
||
|
||
- 头文件:`CPU-Software-Renderer/libs/SDL2/include`
|
||
- Win32 库:`CPU-Software-Renderer/libs/SDL2/lib/x86`
|
||
- x64 库:`CPU-Software-Renderer/libs/SDL2/lib/x64`
|
||
|
||
## 构建与运行
|
||
|
||
1. 用 Visual Studio 打开 `CPU-Software-Renderer/CPU-Software-Renderer.vcxproj`
|
||
2. 选择 `Debug` 或 `Release`
|
||
3. 选择 `Win32` 或 `x64`
|
||
4. 构建并运行
|
||
|
||
说明:
|
||
|
||
- 工程里已经分别配置了 Win32 和 x64 的 SDL2 include/lib 路径
|
||
- 运行时需要让程序找到与平台匹配的 `SDL2.dll`
|
||
- 如果你移动了仓库位置,可能需要同步检查 `.vcxproj` 里的绝对路径
|
||
|
||
## 设计取向
|
||
|
||
当前代码结构遵循一个比较简单的原则:
|
||
|
||
- 纯数据类型放在 `Math` 和 `RenderData`
|
||
- 做事的模块放在 `Core`、`Rasterizer`、`Asset`、`Shading`
|
||
- 先把 2D 基础链路理顺,再逐步加 3D pipeline
|
||
|
||
这意味着现阶段更强调“结构和边界先理清”,而不是一次性把所有功能堆进去。
|
||
|
||
## 后续计划
|
||
|
||
按 `TODO.md` 的路线,后续会逐步补齐:
|
||
|
||
1. 稳定的三角形填充
|
||
2. MVP 变换
|
||
3. Z-buffer
|
||
4. 属性插值
|
||
5. Blinn-Phong 光照
|
||
6. OBJ 模型加载
|
||
7. 相机控制
|
||
|
||
如果后续继续扩展,还可以考虑:
|
||
|
||
- Texture Mapping
|
||
- MSAA
|
||
- 更完整的数学库
|
||
- 更清晰的 shader 输入输出结构
|
||
|
||
## 说明
|
||
|
||
这个项目现在更接近“正在搭骨架的 renderer”,不是一个已经完成的 3D 渲染器。
|
||
|
||
README 中提到的很多模块和目录,目的是反映当前的架构方向;其中一部分已经有初步实现,另一部分还只是为后续阶段预留。
|