漫威蜘蛛侠中的程序化光照
原标题
Marvel’s Spider-Man: Procedural Lighting Tools
程序化布光以及 Probe / Light Grid 分布。
Open World Tiles
- 将整个世界分成数个 128 x 128 米的 Tile,对于每个 Tile,由数个 JSON 文件描述该 Tile 所引用的资源。
- 只有玩家当前所在的和周围的 Tile 会流入内存,其余的 Tile 卸载。
- 极远处的渲染由下文会讲到的 Impostor 系统负责。
Procedural Placement
- 程序化沿着街道放置路灯。
- 可视化所有光源的位置及其光照范围(RayCast),以找到打光不足的区域。
Light Probes(Specular)
- 在每个 Tile 中均匀划分四个区域,在每个区域中心生成一个 Probe。
- 将 Probe 移动到距离最近的街道上,优先主干道,然后次干道。
- 如果 Probe 位于建筑物内,用 SDF 将其移出。
- Probes 所捕获的信息来自 Impostor 系统。
- 在磁盘上存储 Light Probe 信息数据量过大,故使用实时的 Light Probe 生成。
- 每个 Probe 的每个面分辨率为 512 x 512,然后向下进行 5 层卷积存储为 MipMap。
IG-Impostors
- 相关的 Mesh 和 Texture 常驻于全局内存中,代表最低级别的 LOD。
- 所有 Mesh 共占 100 MB,Texture 共占 90 MB,还有一些高质量的用于自发光以及反射的 Mesh 共占 30 MB。
- 一共 220 MB 的数据来表示整个城市的最低级别 LOD,可以被任何系统访问。
- 一张贴图存储 albedo,一张一半分辨率的贴图存储 specular,gloss,emission。
Light Grids
- 每个 128 x 128 米的 Tile 被划分为数个 16 x 16 x 16 的 capture volume。
- 由建筑物高度决定立方体的分布。
- 移除建筑物内部的立方体。
- Light Grids 信息生成为 JSON,引擎读取后进行采样并存储为 Cache File。
- 每个 capture volume 内 4096 个样本,一立方米一个。
- 每个样本生成每个面 256 x 256 像素的立方体贴图。
- 然后每个面被卷积至单个 HDR 像素,用以表示 diffuse 和方向(高度可压缩的)。
Others
- 还存在一个 Hibernation 系统,简单来说只是拥有一个更远的剔除平面,用于处理一些被 Impostors 系统认为过于复杂而被剔除的物体,比如公园里的长椅,楼顶的空调外机等。
- Light Probe 的更新大约为每秒两次,具体则由引擎的任务系统调度。
- 一共有 4 份 Light Grid 数据来描述一整天中的漫反射信息,分别为正午,阴天,黎明/黄昏,夜晚,
- 每个 Probe 存储一份可见的建筑列表。
- 通过视锥体,移动方向,移动速度来决定如何优化加载哪些 Tile。