漫威蜘蛛侠中的程序化光照

原标题

Marvel’s Spider-Man: Procedural Lighting Tools
程序化布光以及 Probe / Light Grid 分布。

Open World Tiles

Tile

  • 将整个世界分成数个 128 x 128 米的 Tile,对于每个 Tile,由数个 JSON 文件描述该 Tile 所引用的资源。
  • 只有玩家当前所在的和周围的 Tile 会流入内存,其余的 Tile 卸载。
  • 极远处的渲染由下文会讲到的 Impostor 系统负责。

Procedural Placement

ProceduralPlacement

  • 程序化沿着街道放置路灯。
  • 可视化所有光源的位置及其光照范围(RayCast),以找到打光不足的区域。

Light Probes(Specular)

  • 在每个 Tile 中均匀划分四个区域,在每个区域中心生成一个 Probe。
  • 将 Probe 移动到距离最近的街道上,优先主干道,然后次干道。
  • 如果 Probe 位于建筑物内,用 SDF 将其移出。
  • Probes 所捕获的信息来自 Impostor 系统。

LightProbes

  • 在磁盘上存储 Light Probe 信息数据量过大,故使用实时的 Light Probe 生成。
  • 每个 Probe 的每个面分辨率为 512 x 512,然后向下进行 5 层卷积存储为 MipMap。

IG-Impostors

IG

  • 相关的 Mesh 和 Texture 常驻于全局内存中,代表最低级别的 LOD。
  • 所有 Mesh 共占 100 MB,Texture 共占 90 MB,还有一些高质量的用于自发光以及反射的 Mesh 共占 30 MB。
  • 一共 220 MB 的数据来表示整个城市的最低级别 LOD,可以被任何系统访问。
    Texture
  • 一张贴图存储 albedo,一张一半分辨率的贴图存储 specular,gloss,emission。

Light Grids

Grid

  • 每个 128 x 128 米的 Tile 被划分为数个 16 x 16 x 16 的 capture volume。
  • 由建筑物高度决定立方体的分布。
  • 移除建筑物内部的立方体。
  • Light Grids 信息生成为 JSON,引擎读取后进行采样并存储为 Cache File。

LightGrids

  • 每个 capture volume 内 4096 个样本,一立方米一个。
  • 每个样本生成每个面 256 x 256 像素的立方体贴图。
  • 然后每个面被卷积至单个 HDR 像素,用以表示 diffuse 和方向(高度可压缩的)。

Others

  • 还存在一个 Hibernation 系统,简单来说只是拥有一个更远的剔除平面,用于处理一些被 Impostors 系统认为过于复杂而被剔除的物体,比如公园里的长椅,楼顶的空调外机等。
  • Light Probe 的更新大约为每秒两次,具体则由引擎的任务系统调度。
  • 一共有 4 份 Light Grid 数据来描述一整天中的漫反射信息,分别为正午,阴天,黎明/黄昏,夜晚,
  • 每个 Probe 存储一份可见的建筑列表。
  • 通过视锥体,移动方向,移动速度来决定如何优化加载哪些 Tile。