unity Reflection Probe

来源:互联网 发布:软件开发服务合同 编辑:程序博客网 时间:2024/05/22 15:17

Reflection Probe相关

天空盒的信息不可能包含所有的场景对象,在许多情况下,对象从天空搜集反射信息时可能会被遮蔽,像是室内对象或是在类似桥或是隧道等建筑物里的对象,为了要准确反射这些对象,必须用反射探头针对这些对象取样,这种探头从他们的位置对周围取样并把结果写到方体贴图,可以让周围经过的物体得到环境的反射影像。可以透过GameObject->Light->Reflection Probe来新增一个反射探头,反射探头的位置会决定方体贴图取样的内容,以及反射所看起来的样子,基于效能考虑反射探头越少越好,反射探头并非用来让物理得到精确结果,而是让游戏世界有更好的反射,大多数情况下几个安排妥当的反射探头就很足够了。

Reflection Probe种类

  1. Baked:在编辑器里存储一个生成的反射cubemap。可以点inspector窗口下面的bake按钮或者light窗口下边的bake按钮进行烘焙生成反射cubemap。跟烘焙lightmap差不多,如果light窗口Auto勾选上了,会自动更新cubemap。baked探头只能显示标记为Reflection Probe Static的物体。一旦烘焙完后,cube map就不会变化,所以不会受移动物体实时变化的影响。消耗比实时的小很多。可以更进一步,通过culling mask和clipping plane属性(像摄像机一样)将不想要的物体屏蔽出reflection probe。
  2. Realtime:在运行时实时生成cubemap,也就是说反射不局限于静态物体,而且在场景中会实时更新。然而,需要花费大量的处理时间刷新光探头,unity允许你通过脚本触发刷新。同时,有选项控制刷新,这样就可以好几帧刷新一次。也可以通过culling mask和clipping plane控制哪些物体加入反射cubemap。
  3. Custom:这种也可以在场景中烘焙,像Baked探头一样,但是你可以设置一个自定义的反射cubemap,自定义的也不会实时更新。但有动态物体选项,勾选上后,允许没有标记为Reflection Probe Static的物体加入反射cubemap中。

Reflection Probe的使用

  1. 首先我们在场景中添加两个游戏对象,一个Sphere,一个Cube。然后再创建两个材质球。
    第一个命名为Green_Metalic。用shader是standard;第二个命名为Mirror,shader是standard(Specular setup),Specular下的Smoothness设为1.Green_metalic给Sphere,Mirror给Cube;
  2. 将cube放大,把sphere放在cube前面,添加Reflection Probe。调成RealTime类型,cube上就会看到绿色的影子;
  3. 将类型设为bake,将sphere设为Reflection Probe static,点击烘焙,cube上能看到绿色的影子;
  4. 将类型设为custom,将之前生成的reflection cubemap设到cubemap那儿,将sphere的reflect probe static勾选去掉,勾选probe上的dynamic object,cube上会看到绿色的影子。

重叠的Reflection Probe

当一个物体横跨了多个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.用在外部物体上,当物体离开反射探头的包围盒时,会渐变到天空盒的反射。

几个属性

  1. 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会进行一个混合.

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

  3. Box Offset—取样点相对于影响范围中心的偏移. 当勾选了Box Projection的时候, Box Offset会影响Reflection Probe的UV映射.

  4. Box projection:一般情况下,反射cubemap是被假设在无限远出投射出来的图像,不同的角度都能看到反射的团,但是当你距离反射物体远近改变时,这个反射的图案不会发生改变,这个特性,一般情况下,在室外场景很适用,但是到了室内就不行了,开启Box projection 选项,(支持Shader Model3以上平台可用)允许我们创建一个投射有限距离内的物体,当我们与反射物体距离发生变化时,反射图案的尺寸也同样发生变化,Probe Size以及Probe Origin会影响Reflection Probe的映射图案的效果.

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

  6. 相互反射:有一种情况,两个镜子离得很近,相对放着,每个镜子都不仅反射镜子的反面,还反射了这个镜子产生的折射。结果是无尽的两者间的反射,这个就叫做相互反射。反射探头通过从他们的位置获取镜头快照来创建cubemap,然而,只有要给镜头快照是无法实现相互反射的效果,所以,相互反射阶段需要额外的快照。反射可以在两个物体间反弹的次数可以通过light窗口,environment->environment reflections->bounces属性设置。这个会对所有探头全局变化。bounce为1,光探头看到的反射物体是黑的,为2,第一次相互反射的物体可见,为2,第二层反射的物体可见。注意,反射的反弹数和探头在整个烘焙过程中被递增再次烘焙的次数。

Reflection Probe性能和优化

渲染一个反射探头的cubemap会消耗大量时间是由于:

  1. 需要在探头的起始位置分别渲染6个cubemap面;
  2. 这些探针需要为每个反射级别单独花费时间渲染;
  3. cubemap的不同mipmap需要一个混合的过程;
    渲染probe的时间既影响编辑器内部烘焙,又影响实时性能。下面是一些性能优化的建议。

统一的建议

  1. 分辨率:当反射细节不是很重要(反射物体很小或很远)时,可以将分辨率设置小点儿;
  2. culling mask:用这个可以避免渲染一些不重要的物体,比如一些小物体可以放到一个layer中,用culling mask避免在反射中渲染他们;
  3. 贴图压缩:可以通过控制烘焙反射探头贴图的压缩减少gpu消耗:在light窗口,Environment Lighting->Reflection,压缩下拉列表。注意,实时反射探头在内存中没有压缩,他们在内存的大学取决于分辨率和HDR设置。所以,实时反射探头分辨率更敏感;

实时探头优化

实时探头的渲染负载比编辑器里烘焙的影响更大。更新比较频繁,如果不正确管理会对帧率影响较大。以下几个属性可以让你有效率地控制探头渲染:

  1. 刷新模式

    • 控制什么时候刷新探头,最费的是逐帧,需要的代码最少,但如果每个探头都用这个,将会有很大的性能问题。
    • On Awake,探头只是在运行,启动场景的时候刷新一次。可以用于探头在运行时安装,再也不修改的情况;
    • via Scripting, 让你通过脚本来控制光探头的更新。尽管需要编写脚本,但确实考虑到了性能优化。比如,根据表面上的大小更新探头。
  2. 时间分段

当刷新模式设置为每帧,处理负载会很大。时间分段让你将更新消耗扩散到好几帧,从而减小给定时间的负载。这个属性有3种选择:

  • 所有面一次:使6个cubemap的面(在同一帧)立即渲染,但这6个第一级mipmap的混合放在不同帧进行。剩下mipmap的混合放在同一帧,结果在另一帧中被拷贝到cubemap。整个更新花费9帧,性能消耗中等(9帧之内再次通过Via Scripting调用刷新是无效的);

  • 单独面:跟所有面一次差不多,只是最初每个面的渲染放在单独的帧(而不是同一帧)。整个update花费14帧。这个选项对帧率的影响最小,但较长的更新时间会比较明显。比如灯立马就亮了(14帧之内再次通过Via Scripting调用刷新是无效的);

  • 没有时间分段:每个探针的更新在一个单独的帧里完成,保证了反射与物体的表现精确地同步,但成本很高 (1帧之内再次通过Via Scripting调用刷新是无效的)。

  • 参考:http://blog.csdn.net/yy763496668/article/details/52815579
    http://blog.csdn.net/yupu56/article/details/53487216
    https://docs.unity3d.com/Manual/ReflectionProbes.html

原创粉丝点击