Witchcraft — 一个 D3D12 驱动的实时渲染引擎。
~53,000 行 C++ · 26 个 HLSL Shader · 9 个编辑器窗口
Witchcraft 是一个从零构建的游戏引擎,目标是亲手拆解现代实时渲染的每一个环节。它不是一个拿来就用的成熟产品,而是一份活的渲染管线系统、ECS系统和动画 / 骨骼系统。
当前阶段聚焦于 PBR 前向渲染 的完整实现:从 Assimp 导入、自建文件格式、Flecs ECS 场景管理,到 D3D12 多线程命令录制、阴影/SSAO/体积光效果链,再到 ImGui 编辑器工具链的闭环。
主线程 (Win32 消息泵)
│
├── resize 标志 ──atomic──→ 渲染线程 (无锁轮询)
│
└── InputMessage 队列 ──mcv──→ 输入线程 (条件变量)
渲染线程每帧自行检查 resize 原子变量,不阻塞等信号;输入线程用生产者-消费者队列阻塞等待,有事件才被唤醒。二者完全对等,不存在主线程→渲染线程的直接通信。
| Pass | 说明 |
|---|---|
| Shadow (静态缓存层) | 增量更新,静态投射体缓存回写 |
| SSAO + 双边模糊 | Compute Shader 驱动 |
| GPU Skinning | 256 骨骼/绘制,三重缓冲 VB |
| Volumetric Light | Ray marching 沿深度重建 |
| RenderToTexture | 离屏渲染 / 虚拟相机 / 镜面反射 |
| OIT (Weighted Blended) | 独立累积 + 混合纹理 |
| FXAA | 后处理抗锯齿 |
4 个工作线程在 RenderB 中并行录制 Shadow / Normal / Opaque / Translucent 四个阶段的命令列表,渲染项按名称排序后均匀分片,ExecuteCommandLists 一次性提交到 GPU 队列。
每个实体内部通过 ServicesContainer 持有 14 种组件(C++ 侧),关键变换和类型标签同步到 Flecs World。这层双存储让编辑器能直接操作 C++ 组件,同时 Flecs 提供 ECS 查询能力供渲染线程组装 RenderItem。
FBX/glTF ──→ Assimp ──→ ImportedAssetTypes
│
.wmodel / .wmat / .wskel / .wanim / .wscene / .wskinnedmesh ←┘ (XML 中间格式)
│
└──→ D3DWindow 几何注册列表 ──→ GPU
无 UV 模型自动生成纹理坐标(自适应圆柱/平面投影 + 极点拆分),WRAP 采样器自然处理接缝。
| 类别 | 功能 |
|---|---|
| 渲染 | PBR (粗糙度/金属度/自发光/G 缓冲) |
| 天空盒 | |
| 级联阴影(平行光) + Cube Shadow (点光 )+ 一般阴影(聚光) | |
| SSAO 环境遮蔽 | |
| 体积光 (Ray Marching) | |
| RenderToTexture 离屏渲染(虚拟相机 / 镜面 / 材质反射) | |
| 透明物体 OIT 合成 | |
| FXAA 快速近似抗锯齿 | |
| 多线程命令录制 (4 工作线程并行) | |
| ECS | Flecs 集成,14 种组件,实体层次结构与重父化,动画 / 蒙皮 / 骨骼同步 |
| 编辑器 | ImGui 多窗口 (场景/材质/动画/骨骼/资产/文件) |
| Transform Gizmo (平移/旋转/缩放) | |
| 骨骼编辑器 (关节属性 / 绑定姿态 / 刷权重可视化) | |
| 射线拾取 (三角形级精确检测) | |
| 资产 | .wmodel / .wmat / .wskel / .wanim / .wscene / .wskinnedmesh |
| Assimp 多格式导入 + UV 自动生成 + 动画 / 骨骼资产导出 | |
| 物理 | JoltPhysics 集成 (碰撞体/刚体) |
后期处理完善 · 脚本
- 粒子系统
- 色调映射管线
- 集群光照剔除 (Clustered Forward)
- 体素全局照明 (VXGI)
- 体积云/雾
- 卡通渲染着色器
- 程序化地形生成
- 水体渲染
- 音频系统
| 项目 | 要求 |
|---|---|
| 语言 | C++20 |
| 平台 | Windows 10/11 |
| GPU | RTX 4060 或 RX 6000 系列 |
| IDE | Visual Studio 2022 |
本项目站在以下开源项目的肩膀上:
| 库 | 用途 |
|---|---|
| ImGui | 编辑器 UI 框架 |
| Assimp | 3D 模型导入 |
| Flecs | ECS 运行时 |
| DirectXTK12 | D3D12 工具链 |
| JoltPhysics | 刚体物理模拟 |
| pugixml | XML 文件解析 |
| Lua + sol2 | 脚本引擎 |
| Box2D | 2D 物理 |
| zlib | 数据压缩/解压缩 |
