Unity5.x Reflection Probe介绍

发表于2018-08-26
评论0 9.1k浏览
本篇文章给大家介绍下Reflection Probe, 大家都知道:当使用标准着色器时,每一个材质都会具有一定程度的镜面反射(specularity)和金属反射(metalness)属性,在没有强大的硬件来处理即时光迹追踪反射的情况下,我们得仰赖预先计算着色反射,我们使用了一个由六张描述天空的图片所组成的方体贴图(Cubemap)然后在和其他光和地表信息混合运算来仿真如同我们真实世界看到的反射效果。

从Unity 5.x开始,我们可以反射探头(Reflection Probe)产生贴图来模拟反射。

工作原理:在某个定点搜集环境信息,动态生成cubemap 反射贴图。

当一个物体横跨了多个Reflection Probe的时候, 他的Mesh Renderer中会自动加入所有他触及到的Reflection Probe. Weight是通过计算每个他触及的Reflection Probe和这个物体之间距离来得出的。 另外还可以单独调节Reflection Probe的”Importance”这个参数来手动干预这个计算结果。

Mesh Renderer的Reflection Probes选项能够选择四种使用Reflection Probe的方法:
1.Off:代表不使用Reflection Probe。

2.Simple:代表只使用列表中Weight值最大的那个ReflectionProbe。

3.Blend Probes:should be used for interior objects, that way you’ll ensure that object won’t accidentally use reflections from skybox (a.k.a default reflection)。

4.Blend Probes And Skybox:should be used for exterior objects, that way when object leaves the bounding box of reflection probe, it will gradually switch reflections from reflection probe to skybox。

下面我们讲一下Refelection Probe的面板参数,这里只讲无法第一时间测试出意义的参数。 其他参数都比较简单。

Type选择类型, 三种可选:
Baked:用于烘焙模式的,在Lighting面板下点击Bake进行烘焙光照贴图时,生成对应的反射贴图。
Custom:自定义一个cubeMap来指定反射贴图,选择Dynamic Objects可将非静态物体也给Bake出来。
Realtime:实时生成反射贴图,但是和实时光照一样的消耗性能,

详细参数见下:
Time Slicing---官方文档上说这个选项仅仅针对于当我选择了Every frame作为刷新模式的情况, 实则不然, 因为不管是On Awake还是Every frame还是Via scripting, 这个Time Slicing都是有效果的, 要了解这个选项。 首先要了解一下Reflection Probe的内部生成机制, 一个Realtime的Reflection的生成有三个步骤:第一个步骤要计算一个Cubemap的六个面, 第二步要考虑这个Cubemap的mipmap(文档上说为了支持Glossy Reflections, mipmap是必要的, 而Glossy Reflections对于调节不同程度的Smoothness时是有一定效果上的提升的), 第三步是将计算结果拷贝到Cubemap中。

那么TimeSlicing的三个选项分别有不同的三步计算所需帧数:
All faces at once---9帧, 性能消耗中等。 (9帧之内再次通过Via Scripting调用刷新是无效的)

Individual faces---14帧(在9帧的基础上加了将六个面分为六帧的那多出来的五帧), 性能消耗最低。(14帧之内再次通过Via Scripting调用刷新是无效的)

No time slicing---1帧。 所有动作都在同一帧执行, 这种性能消耗最大。 (1帧之内再次通过Via Scripting调用刷新是无效的)

Importance---影响了一个MeshRenderer中的多个ReflectionProbe的Weight的自动混合比例。 当一个物体处在多个Reflection Probe的”领地”内的时候, 首先会考虑每个Reflection Probe的Importance, 之后, 在此基础上才会考虑每个Reflection Probe与该物体之间的分别的交叉的体积的大小。 也就是说Importance的优先级高于交叉体积的计算。

关于交叉体积的计算: For ex, if the first volume is 1.0 and the second is 2.0, then first probe’s influence will be 1.0 / (1.0 + 2.0) = 0.33, the second probe’s influence will be 2.0 / (1.0 + 2.0) = 0.67. 还有一种特殊情况, 就是就是一个小的Probe套在一个大的Probe里面, 而一个物体又完全在这个小的Probe里面, 那么对这个物体来说, 小的Probe的Weight会是1, 大的会是0. 而当这个物体逐渐脱离这个小的Probe的时候, 那么小的Probe和大的Probe对于这个物体的Weight会进行一个混合。

Size---该Reflection Probe的影响范围。 进入这个范围的MeshRenderer会自动和这个Reflection Probe产生关联。 同时, 当Box Projection开启的时候, 这个Size也会影响Reflection Probe的UV映射。

Probe Origin---取样点相对于影响范围中心的偏移。 当勾选了Box Projection的时候, Probe Origin的位置会影响Reflection Probe的UV映射。

Box projection:一般情况下,反射cubemap是被假设在无限远出投射出来的图像,不同的角度都能看到反射的团,但是当你距离反射物体远近改变时,这个反射的图案不会发生改变,这个特性,一般情况下,在室外场景很适用,但是到了室内就不行了,

开启Box projection 选项,(支持Shader Model3以上平台可用)允许我们创建一个投射有限距离内的物体,当我们与反射物体距离发生变化时,反射图案的尺寸也同样发生变化,Probe Size以及Probe Origin会影响Reflection Probe的映射图案的效果。

Shadow Distance---反射阴影距离, 特性和Quality Setting中的特性一样, 数值越小, 在反射画面中阴影显示越近, 但阴影越精细, 调成0会完全关闭阴影。

参考:  
https://docs.unity3d.com/Manual/ReflectionProbes.html  
http://tieba.baidu.com/p/3690939628  
http://www.cocoachina.com/game/20150701/12339.html
来自:https://blog.csdn.net/yupu56/article/details/53487216

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引