【Unity】光照解决方案笔记

【Unity】光照解决方案笔记

https://docs.unity.cn/cn/2022.3/Manual/BestPracticeLightingPipelines.html

确定对象显示效果的三阶段

  1. 剔除

    列出了需要渲染的对象,确保这些对象摄像机可见(视锥体剔除)且不被遮挡(遮挡剔除)。

  2. 渲染

    将这些对象绘制到基于像素的缓冲区中(通过正确的光照以及它们的一些属性)。

  3. 后期处理

    在这些缓冲区上执行后期处理操作,生成发送到显示设备的最终输出帧。

光照类型

  • 直接光照

从自发光光源(如灯泡)发出的光照,而不是光从表面反射的结果。

  • 间接光照

由于光从表面反射并通过介质(如大气或半透明物质)传播和散射而形成的结果。

全局光照(GI)

全局光照 (Global Illumination) 是一组特殊照明技术的总称,它考虑了综合且复杂的现实光照模型(如光的反射、折射等),并以此对直接和间接光照进行建模,从而为游戏提供逼真的光照效果

从使用角度来看可以将 GI 简单理解为产生间接光的手段。单纯的兰伯特光照之类的经验光照模型技术并不是 GI。

GI 提供几种方法,如:

  • 烘焙/动态光照贴图(Unity 支持)
  • 烘焙/动态光照探针(Unity 支持)
  • 辐照度体积
  • 光传播体积
  • 基于体素的 GI 和基于距离场的 GI

光照贴图程序(Lightmapper)

这是一个基础系统,它通过发射光线、计算光线反弹并将产生的光线应用到纹理来生成光照贴图和光照探针的数据。

如何点亮你的项目?

https://docs.unity.cn/cn/2022.3/uploads/Main/BestPracticeLightingPipeline15.svg

  1. 选择渲染管线

    • Built-in RP
    • URP
    • HDRP
    • 自定义 SRP
  2. 决定 GI 模式(产生间接光的 GI 系统)

    • 烘焙 GI
    • 实时 GI
    • 烘焙 & 实时 GI
  3. 选择光照模式(GI 光与实时光的混合方式)

    • Baked Indirect
    • Subtractive
    • Shadowmask
    • Distance Shadowmask
  4. 添加场景光照

    • 添加灯光
    • 添加发光表面
    • 添加反射探针
    • 添加光照探针
    • 添加光照探针代理体(LPPVs)

渲染管线

内置渲染管线(Built-in RP)

2018 年之前,Unity 只有一个内置渲染管线(Built-in RP),其提供两种渲染路径。

  • 向前渲染(多通道:每一盏灯光占用一个 Pass)
  • 延迟渲染

高清渲染管线 (HDRP)

提供了先进的渲染和着色功能,为高端游戏平台设计。

  • 混合延迟/前向瓦片/聚类渲染器

通用渲染管线(URP)

内置管线替代品,保持全平台通用且性能提升。

  • 向前渲染(单通道:一个 Pass 中渲染所有灯光)
  • 向前渲染+:Unity 2022.2 新增
  • 延迟渲染:Unity 2021.2 新增

渲染路径

向前渲染路径

按顺序渲染场景中的所有对象和灯光。

当对象被多个光源照亮时,渲染成本会急剧增加。

这种类型的渲染器通常提供各种各样的着色器,并且可以很轻松地处理透明度。

延迟渲染路径

先将所有不透明几何体渲染到缓冲区中,其中存储着有关材质的信息(颜色,镜面反射,光滑度等)。然后在后一个 Pass(也就是名字中的“延迟”)渲染所有像素的灯光信息。

渲染时间将主要取决于影响每个像素的光源数量。但对于透明对象或更复杂的着色器对象,依然需要回退到向前渲染路径中渲染。

当处理包含许多动态光源的场景时(例如具有人工光照的内部空间,或室外与室内光照相结合的项目),通常建议使用延迟渲染。

Unity 中的 GI 系统

在 Unity 的 5.6 之前,Unity 主要使用 Geomerics 公司的 Enlighten 来提供实时 GI 以及烘焙 GI,但在 5.6 之后 Unity 引入了新的 Progressive Lightmapper,如今 Enlighten 将陆续弃用。

Unity GI 发展计划

  • 实时 GI

    • Enlighten 实时 GI(已弃用,仅支持到 Unity 2024)
  • 烘焙 GI

    利用光照贴图程序将光照数据烘焙到光照探针、反射探针、称为光照贴图的纹理中

    • Enlighten 烘焙 GI(已弃用,仅支持到 Unity 2021)
    • 渐进式光照贴图程序(Progressive Lightmapper)

不要同时使用 Enlighten 实时 GI 和烘焙 GI,这将对性能产生影响,且两者获取到的间接光也存在视觉差异。

如何让物体获取间接光

  • 静态物体

    标记为“Contribute GI”的物体将被识别为静态物体,只有静态物体可以接受烘焙/预计算的 GI 光照。

  • 动态物体

    动态物体只能通过光照探针获得间接光的支持。

由于光照的烘焙是一个相当缓慢的过程,所以只推荐自身具有不同光照变化(如存在凹洞或接受自身阴影)的大型复杂物体才推荐标记“Contribute GI”;对于自身受光均匀的小型凸面网格应该作为动态物体从光照探针中获取间接光。

  • 大型不可烘焙物体(如大型粒子系统或蒙皮网格)

    可以使用 LPPV(Light Probe Proxy Volume)来获取更好的本地化间接光照。

要最大程度减少烘焙时间并同时保持足够的光照质量,最重要的就是限制场景中标记为“Contribute GI”的对象数量。

照明优化教程:
https://learn.unity.com/project/lighting-optimization-with-precomputed-realtime-gi

光照模式

Light 组件和 Lighting Settings Asset 中都有一个光照模式的设置,但两者是不同的概念。

灯光光照模式

  • 烘焙
    为 GI 提供光照信息,从这些光源产生的直接和间接光照将被光照贴图程序处理。
  • 实时
    实时计算的光照效果,受性能影响无法产生间接光,且光照没有 GI 的效果真实。
  • 混合
    提供实时光照的同时也为烘焙光照(GI)提供烘焙信息,并能将两种光照进行混合,混合方式取决于场景光照模式。

场景光照模式

指定场景中实时光照和烘焙光照(GI)的混合方式,配合灯光的混合模式使用。

前置说明

  • 阴影贴图:实时阴影实现方案
  • 阴影距离:显示阴影的最大范围。若非注明,则所有阴影都受此影响

具体方案

  • Subtractive

    最早的混合光照模式。将大部分光照和阴影都采取烘焙实现,仅提供主方向光的实时灯光。

    光照效果比较简陋,但在低端硬件上非常有用。

    接收光照 静态物体 动态物体
    直接光照 光照贴图 实时
    间接光照 光照贴图 光照探针
    静态物体阴影 光照贴图 光照探针
    动态物体阴影 阴影贴图(仅主方向光) 阴影贴图(仅主方向光)
    • 主方向光:强度最高的方向光
  • BakedIndirect

    仅烘焙间接光,直接光和阴影都采用实时计算。

    光照效果逼真,但有一定的性能问题。

    接收光照 静态物体 动态物体
    直接光照 实时 实时
    间接光照 光照贴图 光照探针
    静态物体阴影 阴影贴图 阴影贴图
    动态物体阴影 阴影贴图 阴影贴图
  • Shadowmask

    升级版 BakedIndirect,针对静态物体阴影进行了优化,可同时采取烘焙和实时两种方案,且可以超出阴影距离限制。

    光照效果更逼真,且在性能上有一定优化。

    接收光照 静态物体 动态物体
    直接光照 实时 实时
    间接光照 光照贴图 光照探针
    静态物体阴影 阴影贴图 | 阴影遮罩 阴影贴图 | 光照探针
    动态物体阴影 阴影贴图 阴影贴图
    • 阴影遮罩:一种额外的光照贴图,用于确定目标像素是否在阴影中。

    针对静态物体阴影方案有两种模式:

    • DistanceShadowmask:阴影距离内采用阴影贴图实现,超出则采用烘焙实现。
    • Shadowmask:全距离的都采用烘焙实现。

后处理间接光

GI 烘焙间接光的时间很长不利于快速原型开发,此时可以利用“屏幕空间环境光遮蔽”功能来模拟间接光效果。


【Unity】光照解决方案笔记
https://bdffzi-blog.pages.dev/posts/150670921.html
作者
BDFFZI
发布于
2024年3月4日
许可协议