Notifications
Article
Reflection Probe(反射探针)
Published 14 days ago
40
0
CG电影和动画通常具有高度逼真的反射,这对于实现场景对象之间的“连通性”感觉是很重要的。然而,这些反射的准确性伴随着处理器时间的高成本,虽然这对于电影来说不是问题,但它在实时游戏中严重限制了对反射对象的使用。
传统上,游戏使用一种称为反射贴图的技术来模拟来自对象的反射,同时将处理开销保持在可接受的水平。此技术假定场景中的所有反射对象都可以“看到”(因此会反射)完全相同的周围环境。如果游戏的主角(比如闪亮的汽车)处于开放空间中,此技术将非常有效,但是当角色进入不同的周围环境时,便看起来不真实;如果一辆汽车驶入隧道但天空仍然在窗户上产生明显反射,看起来就很奇怪。
Unity通过使用反射探针改进了基本反射贴图,这种探针可在场景中的关键点对视觉环境进行采样。通常情况下,应将这些探针放置在反射对象外观发生明显变化的每个点上(例如,隧道、建筑物附近区域和地面颜色变化的地方)。当反射对象靠近探针时,探针采样的反射可用于对象的反射贴图。此外,当几个探针位于彼此附近时,Unity可在它们之间进行插值,从而实现反射的逐渐变化。因此,使用反射探针可以产生非常逼真的反射,同时将处理开销控制在可接受的水平。

反射探针的工作原理

场景中某个点的视觉环境可由立方体贴图表示。立方体贴图在概念上很像一个在内部表面绘有六个方向(上、下、左、右、前、后)平面图像的盒子。
为了让对象显示反射,其着色器必须能够访问表示立方体贴图的图像。对象表面的每个点都可在表面朝向的方向(即表面法向矢量的方向)上“看到”立方体贴图的一小块区域。着色器在此处使用立方体贴图的颜色来计算对象表面应该是什么颜色;镜面材质可能会准确反射颜色,而闪亮的汽车可能会略微褪色和着色。
如上所述,传统的反射贴图仅使用单个立方体贴图来表示整个场景的周围环境。立方体贴图可由美术师绘制,也可通过从场景中的一个点进行六次“快照”(每个立方体面对应一次快照)获得。反射探针在这方面进行了改进,允许您在场景中设置许多预定义的点,在这些位置点可创建立方体贴图快照。因此,您可以在场景中存在明显不同反射的任何位置点记录周围视图。
除了视点之外,探针还有一个由场景中的不可见盒体形状定义的效果区域。在探针区域内通过的反射对象的反射立方体贴图由该探针临时提供。当对象从一个区域移动到另一个区域时,立方体贴图会相应改变。

反射探针的类型

反射探针有三种基本类型,通过检视面板中的Type属性可进行相应选择。
  • 烘焙(Baked)探针可存储Editor中生成(烘焙)的反射立方体贴图。可以通过单击Reflection Probe(反射探针)检视面板底部的Bake按钮或Lighting窗口中的Build按钮来触发烘焙。如果在Lighting窗口中启用了Auto,则在 Scene视图中放置对象时,烘焙探针将自动更新。烘焙探针的反射只能显示检视面板中标记为Reflection Probe Static的对象。此设置向Unity指示这些对象不会在运行时移动。
  • 实时(Realtime)探针在运行时在播放器中而不是在Editor中创建立方体贴图。这意味着反射不仅限于静态对象,而且可以实时更新以显示场景中的变化。但是,刷新探针的视图需要相当长的处理时间,因此谨慎管理更新就显得十分重要。Unity 允许从脚本中触发更新,以便能够准确控制更新的发生时间。此外,还有一个选项是应用时间切片来探测更新,使更新可在几帧内逐渐发生。
  • 还可使用自定义(Custom)探针。这些探针允许在Editor中烘焙视图,就像烘焙探针一样,还能为反射提供自定义的立方体贴图。自定义探针无法在运行时更新。

烘焙探针

烘焙反射探针是在Unity Editor中捕获反射立方体贴图并存储以供后续在播放器中使用的探针。捕获过程完成后,反射将被“冻结”,因此烘焙探针无法响应移动对象在场景中引起的运行时变化。但是,与实时探针(能响应变化)相比,烘焙探针的处理开销要低得多,并且在许多用途中是可接受的。例如,如果只有一个移动的反射对象,那么它只需要反射其静态环境。
烘焙探针捕获的反射只能包含标记为Reflection Probe Static的场景对象。可以使用Culling Mask和Clipping Planes属性进一步优化包含在反射立方体贴图中的对象;具体的工作方式与摄像机的工作方式相同(探针本质上类似于通过旋转观察六个立方体贴图面每一面的摄像机)。
当Auto Generate选项启用时,烘焙反射将在对象放置到场景中时自动更新。如果不使用自动烘焙,则需要单击反射探针检视面板中的Bake按钮以更新探针(Lighting窗口中的Generate Lighting按钮也将触发探针更新)。
无论使用自动烘焙还是手动烘焙,烘焙过程都将继续在Editor中工作时异步进行。但是,如果移动任何静态对象、更改其材质或以其他方式改变其视觉外观,则会重新启动烘焙过程。

自定义探针

默认情况下,自定义探针的工作方式与烘焙探针的工作方式相同,但自定义探针还有其他选项可以更改此行为。
自定义探针检视面板上的Dynamic Objects属性允许未标记为Reflection Probe Static的对象包含在反射立方体贴图中。但是请注意,这些对象的位置在烘焙时仍然会在反射中“冻结”。
Cubemap属性允许将自定义的立方体贴图分配给探针,从而使探针完全独立于可从其视点“看到”的对象。可以使用此属性来设置从3D建模应用程序生成的天空盒或立方体贴图作为反射源。

实时探针

烘焙探针可用于许多用途,并具有良好的运行时性能,但它们的缺点是不能在播放器中实时更新。这意味着对象可在场景中移动但不能让它们的反射随之移动。如果这种问题带来了太多限制,可以使用实时探针,它们会在运行时更新反射立方体贴图。这种效果会带来更高的处理开销,但可提供更强的真实感。
要使探针在运行时更新,应在反射探针检视面板中将其Type属性设置为Realtime。不需要将对象标记为Reflection Probe Static 来捕获它们的反射(就像使用烘焙探针一样)。但是,可以使用Culling Mask和Clipping Planes属性在反射立方体贴图中选择性地排除对象;具体的工作方式与摄像机的工作方式相同(探针本质上类似于通过旋转观察六个立方体贴图面每一面的摄像机)。
在Editor中,实时探针与烘焙探针具有大致相同的工作流程,但它们的渲染速度往往更快。当Auto Generate选项启用时,反射将在对象放置到场景中时自动更新。如果不使用自动烘焙,则需要单击反射探针检视面板中的Generate Lighting按钮以更新探针。
无论使用自动烘焙还是手动烘焙,烘焙过程都将继续在Editor中工作时异步进行。但是,如果移动任何静态对象、更改其材质或以其他方式改变其视觉外观,则会重新启动烘焙过程。
Tags:
尹煜
北京宏宇航天技术有限公司Unity工程师 - Programmer
28
Comments