Unity中反射光照是如何工作的
先来看个案例问题,下图中,苹果的反射效果看起来是很奇怪的。
在它的表面上反射了两种不同颜色的Spot Light光源,还反射了不属于室内环境的来自天空盒的光线,这是有问题的。在解决这个问题之前,我们需要知道在Unity中反射是如何工作的。
Unity中的反射
在游戏或实时应用中,反射贴图(反射映射,reflection mapping)是用来模拟反射的方法,它会假设所有场景中可反射光的物体都能看到相同的环境。在诸如室外场景的简单开放空间中,这并没有什么问题。但在室内场景或更复杂的环境中则会出点问题(里面会增加许多影响反射的变量)。
举个例子,想象有一个赛车游戏,其中部分路面通过一个隧道包裹了起来。如果玩家在隧道内的时候,车身仍然反射了天空的光线,那么会非常影响体验。
在Unity中,我们可以使用Relection Probes来改善场景中的反射效果质量,它通过在关键点上采样环境信息,来确定此处是否会对反射产生影响。
Reflection Probes如何工作
Reflection Probes在场景中,以一个cubemap的形式记录来自某个点的可见的环境和光照信息,我们可以将它看做是一个立方体,有六个纹理,在立方体的内表面上,这些纹理记录了场景中的特定点的反射信息。这个概念和用于生成天空盒的cubemap是类似的。
当一个游戏物体的shader访问Reflection Probes的cubemap时, 这个物体表面的每个点能够看到这个cubemap的一小部分,这一小部分的区域是由这个表面的朝向所决定的。Shader在计算游戏物体表面的颜色时,会使用该点对应的cubemap中相关的颜色信息。
在Unity中每个场景实际上都有一个秘密的Reflection Probe用来采样天空盒。这个Reflection Probe提供了场景中的基础反射信息,这也是前面例子中金属苹果反射了天空光线的原因所在。
Reflection Probes周围也有一个不可见的盒子来表示其作用范围(zone of effect)的,我们可以配置这个盒子的大小。处于Reflection Probe作用范围内的反射性物体,计算反射的cubemap是由这个Reflection Probe所提供的。当物体从一个范围移动到另一个范围时,cubemap也会相应改变。之前所提到的赛车游戏中,我们可以为隧道设置一个Reflection Probe,在隧道范围内使用这个Relection Probe所提供的信息来计算反射光照效果。
放置并配置Reflection Probe
回到最初的那个金属苹果反光问题,我们在场景中放置一个Reflection Probe来解决这个问题:
1. 在Hierarchy窗口(空白处右键选择Light -> Refleciton Probe)或通过主菜单栏(GameObject -> Light -> Refleciton Probe)添加一个Refleciton Probe
2. 将Refleciton Probe放置到苹果前面,它越接近苹果的实际位置,反射信息计算就会越精确
我们会看到,除了spotlight的反射外,放置了Refleciton Probe后,苹果会变成黑色,这是因为苹果进入了Refleciton Probe的作用范围内了(这个作用范围空间是一个立方体表示的,缩放场景可以看到这个盒子)。
3. 在Refleciton Probe的Inspector中,确认一下Type是Baked。在Runtime Settings中,启用Box Projection属性
Box Projection属性启用后,苹果表面的反射光计算,会和苹果在Refleciton Probe的作用区域内的位置相关。
4. 调整一下Box Size的X,Y,Z值以及Reflection Probe的位置,让Refleciton Probe的作用区域覆盖到我们想要的区域(下图黄色框线表示盒子的大小和位置,仅为示例)
5. 点击Reflection Probe的Inspector面板中最后的Bake按钮进行烘焙
Reflection Prboe需要独立烘焙,除非我们启用了auto-baking(在Lighting窗口中的Auto Generate选项)。
6. 最后,来看看烘焙后,这颗金属苹果的反光效果怎么样