Unity中的Lightmapping技术细节

249 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

Lightmapper如何发射光线

  • 从每个texel向场景中的k个光源,分别发出n个直接射线

image.png

  • 从每个texel向上半球空间均匀发出m个间接射线,这些射线会反弹j次

image.png

image.png

  • 在每个反弹处,向场景中的k个光源,分别发出1个直接射线

image.png

其中, n对应了参数 Direct samplers, m为Indirect Samplers, j 为 Bounces

lightmap分辨率

image.png

  • 这儿所说的分辨率不是图片分辨率,而是每个unit的texel数量。比如一个默认的cube是1x1x1的,如果lightmap resuolutin也是1,那么cube的每个面就在lightmap上占用一个texel,如果分辨率是2,那么就会占用4个texel。

image.png

  • 因为是从texel发射光线,所以texel数量意味着烘焙需要进行的工作量,减少texel数量才可以节约烘焙时间。
  • texel per unit还可以针对每个renderer单独调节:

image.png 最终的结果是这个scale值乘上lightmapping settings中的分辨率。

优化Lightmap: 减少texel数量

减少texel数量可以节省烘焙的时间,提高lightmap的利用率,相同的质量下可以减少lightmap的面积,降低内存占用和载入速度。以下类型的物体应该减少它们在Lightmap上占用的面积:

  • 变化不大的面

image.png

比如这个例子中红色的墙,整个墙的光照变化不大,就可以缩小这个墙的lightmap分辨率。而地面由于有阴影则要保证其分辨率足够大,否则烘焙的阴影就糊了。

  • 只接受到间接光弹射的面
  • 小物体和薄物体(如绳子)

image.png

小物体,薄物体最终在lightmap上可能只占用几个texel,对于最终的效果忽略不计,因此可以不包含在lightmap中,但是如果它们对于全局光照是有比较重要的贡献的,就需要将它们烘焙到light probe中。

  • 不可见的面

不同Light Modes下的Lightmap

Subtractive

烘焙direct和indirect光照

Shadowmask

保存额外的信息到shadowmask图,用于混合实时阴影和烘焙阴影。

Indirect only

从lightmap中丢弃了所有的direct light,只保存低频的间接光照。使用realtime direct light和阴影。

低分辨率可使用baked indirect结合实时阴影

image.png 因为低分辨率时烘焙的阴影太模糊了(左图),那么可以使用baked indirect模式(右图1)结合实时阴影(右图2)

参考资料