Go to file
SepComet 858c0b4d59 viewport 视口变换 2026-03-19 14:16:29 +08:00
CPU-Software-Renderer viewport 视口变换 2026-03-19 14:16:29 +08:00
.gitattributes view matrix + half projection matrix 2026-03-16 14:30:57 +08:00
.gitignore viewport 视口变换 2026-03-19 14:16:29 +08:00
AGENTS.md viewport 视口变换 2026-03-19 14:16:29 +08:00
CPU-Software-Renderer.slnx 重构项目,为后续开发铺路 2026-03-15 16:20:36 +08:00
README.md 重构项目,为后续开发铺路 2026-03-15 16:20:36 +08:00

README.md

CPU Software Renderer

一个基于 C++20 和 SDL2 的 CPU 软光栅化练习项目。

这个仓库当前还处在早期阶段,重点不是调用现成图形 API 画三角形,而是自己维护帧缓冲、自己做基础光栅化,并逐步搭起一个小型 software renderer 的骨架。

当前状态

目前已经完成或具备雏形的部分:

  • 使用 SDL2 创建窗口、纹理和显示循环
  • 在 CPU 侧维护 FrameBuffer
  • 像素写入接口 set_pixel
  • 基础直线光栅化模块 Rasterizer
  • 2D 三角形、包围盒、颜色等基础数据结构
  • 独立的 TriangleRasterizer 模块,用于后续填充三角形

当前 main.cpp 主要用于验证基础链路,程序启动后会在窗口中绘制三条彩色线段组成的三角形轮廓。

还没有完成的核心能力:

  • 完整接入实心三角形渲染流程
  • MVP 变换
  • 深度测试
  • 重心坐标插值
  • 光照
  • OBJ 加载
  • 可交互相机

当前结构

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

  • 放通用数学类型
  • 当前以 Vector2Vector2IntVector3 为主
  • Vector4Matrix4x4 目前还是占位

RenderData

  • 放渲染领域数据,而不是底层数学类型
  • 当前包含 ColorBoundingBox2DTriangle2D

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. 选择 DebugRelease
  3. 选择 Win32x64
  4. 构建并运行

说明:

  • 工程里已经分别配置了 Win32 和 x64 的 SDL2 include/lib 路径
  • 运行时需要让程序找到与平台匹配的 SDL2.dll
  • 如果你移动了仓库位置,可能需要同步检查 .vcxproj 里的绝对路径

设计取向

当前代码结构遵循一个比较简单的原则:

  • 纯数据类型放在 MathRenderData
  • 做事的模块放在 CoreRasterizerAssetShading
  • 先把 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 中提到的很多模块和目录,目的是反映当前的架构方向;其中一部分已经有初步实现,另一部分还只是为后续阶段预留。