简介
imagic 是我正在用 rust + wgpu 实现的一个轻量级渲染框架。
代码仓库:Imagic-gitee 或 Imagic-github
目前,imagic 正处于初始阶段,仅支持有限的渲染特性:
- 材质
- PBR 材质,支持直接光照及 IBL (基于图像的照明)
- Unlit 材质
- Skybox 材质
- 自定义材质或自定义 shader
- HDR 贴图
- 光源
- 点光源
- IBL
- 多相机渲染
- 渲染纹理(RT),支持 2D 渲染纹理,也支持 Cube Texture 作为渲染纹理
- 支持两种基于 compute shader 的方法,为 Cube Texture 生成 mipmaps
- 双线性插值 (Bilinear Filtering)
- 高斯过滤 (Gaussian Filtering with 4x4 samples)
- 集成了 EGUI,提供了“简单的” UI 接口。目前主要用于开发调试。
To do list
- 重构场景管理,可能会使用 ECS
- 解决相机移动时,闪烁的问题
- 让 compute shader 的使用更方便
- 提升多相机渲染能力(clear color)
现在只有第一个相机的 clear color 起作用。接下来,我准备修复它。
- 支持更多渲染特性,例如:
- Directional light, spot light
- Shadows
- Transparent
- Water
- SSS (Sub-Surface Scattering)
- Image Processing
- Terrain generation
- Light Probes
- Physics
我打算用 imagic 写一个游戏,可能简单地物理系统是必要的。我打算集成第三方物理系统库。
imagic 有两个代码仓库:
支持的平台
- Windows
- Linux
- MacOS
理论上,由于 rust 和 wgpu 的跨平台特性,imagic 应该很容易支持 Android, iOS, Web 等平台。后面有时间再做。
例子
- PBR
cargo run --example pbr
这个例子用 PBRMaterial 渲染五个小球,场景中有四个点光源,以及 IBL。我尝试用此例复刻 learnopengl.com 的例子。
- IBL
cargo run --example ibl
这个例子仅渲染 IBL 效果。它提供了 UI 控件,用于调节 PBR 的相关参数。
- skybox
cargo run --example skybox
这个例子用 LDR 天空盒渲染小球,小球受 IBL(烘焙自 LDR 天空盒) 及四个点光源影响。
- multi_camera
cargo run --example multi_camera
这个例子用两个相机渲染同一个小球。这两个相机具有不同的 viewport,且第一个相机,默认会自动旋转。
- mipmaps
cargo run --example mipmaps
这个例子提供了一个 slider UI 控件,拖动它,可以看到不同 lod 的 mipmaps(由 compute shader 生成)。同时,这个例子也展示了自定义材质或 shader 的功能。
注: wgpu 底层是 Vulkan,Metal, D3D12 等现代图形 API,没有 openGL 的 glGenerateMipmap() 功能,要自己实现 cube texture 的 mipmaps。而实现 IBL 的预过滤环境贴图时,要求原始的 cube texture 带有 mipmap。imagic 是自己用 compute shader 实现的。