"We don't train models. We define worlds."
A high-performance Python game engine focused on realistic rendering and large-scale open-world simulation with a unique blend of static-baked and real-time rendering techniques.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
模型: Sypest 的 Crytek Sponza (glTF)
顶点: 192,496 三角形: 262,267
子网格: 25 Draw Call: 1 (MultiDrawIndirect)
纹理: 每子网格独立纹理 (Texture2DArray)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GPU: NVIDIA GTX 750 Ti / 2GB VRAM / OpenGL 4.5
分辨率: 窗口原生 + 0.9x 内部缩放
后期: SSAO + SSR + 体积光 + Bloom + 运动模糊
阴影: 烘焙 2048×2048 + 动态管线就绪(双系统)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
FPS: 26-30 (由于后台占用会有波动) GPU: ~13ms CPU: ~13ms
Shadow(GPU): 0ms Draw(GPU): ~6ms PostFX(GPU): ~4ms
Shadow(CPU): 0ms UBO: 0.1ms Draw(CPU): 0.6ms
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
| 特性 | 实现 |
|---|---|
| 渲染模式 | SingleDC — 25 子网格合并为 1 次 MultiDrawIndirect |
| 纹理 | Texture2DArray,单次绑定,shader 内索引 |
| 阴影视静态 | Baked Shadow Map (2048×2048),一次离屏渲染,0 每帧开销 |
| 影子动态 | 双缓冲异步 Shadow Pass,相机跟随,与烘焙影子 min() 混合 |
| 着色器 | GLSL 450,PerFrame / Draw / Material 三 UBO |
| Tonemapping | ACES 近似 |
| PCF | 5×5 Poisson 采样,动态部分由 uHasDynamic 开关按需关闭 |
SSAO(环境光遮蔽)→ SSR(屏幕空间反射)→ 体积光 → Bloom → 运动模糊。
全部跑在 0.9x 内部分辨率上,硬件 bilinear 升采样回全屏。
| 优化 | 效果 |
|---|---|
| MultiDrawIndirect | 25 draw → 1 draw |
| Uniform 缓存 | glGetUniformLocation 从每帧 54 次降到 1 次 |
| 异步 Shadow | 影子渲染放到帧末尾,主渲染不等待 |
| 烘焙 Shadow | 静态场景影子 0 开销 |
uHasDynamic 开关 |
无动态物体时 shader 跳过第二趟 PCF |
| 0.9x 渲染缩放 | 81% 像素,省 20% GPU 填充率 |
| Draw UBO 按需更新 | 静态场景复用缓存,动态物体自动刷新 |
- Python 3.10+
- OpenGL 4.5 兼容显卡(需要 ARB_shader_draw_parameters、ARB_multi_draw_indirect)
- 最低测试: NVIDIA GTX 750 Ti (2014) — 30 FPS
- 推荐: NVIDIA GTX 1650 或更高
pip install -r requirements.txt
# Sponza 基准测试
python sponza_benchmark.py操作: WASD 移动 | 鼠标旋转 | ESC 退出
HT-Engine/
├── Engine/
│ ├── Renderer/
│ │ ├── Pipelines/ForwardRenderer.py # 前向渲染管线(核心)
│ │ └── Resources/ # Mesh, Material, 模型加载
│ ├── Scene/ # 场景图、相机、光照
│ ├── Math/ # Vector3, Matrix4x4
│ ├── UI/FirstPersonController.py # 第一人称控制器
│ └── Natural/ # 后期特效引擎
├── Shaders/ # GLSL 着色器源文件
├── sponza_benchmark.py # Sponza 基准测试
└── engine_config.json # 引擎配置
"We don't train models. We define worlds."
— Wang Ruilin, Creator of HT_Engine
