imagic - a thin rendering framework by Rust + wgpu

176 阅读2分钟

简介

imagic 是我正在用 rust + wgpu 实现的一个轻量级渲染框架。

代码仓库:Imagic-giteeImagic-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 等平台。后面有时间再做。

例子

你可以在我知乎主页b站油管上观看下面例子的视频。

  • 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 实现的。