Unity Lod 和 Occlusion Culling

Lod和遮挡剔除

遮挡剔除

在我们的场景中,如果物体1在Camera渲染中遮挡了另一个物体2,那物体2就不会再Camera中进行渲染,虽然物体2没有在Camera中进行渲染但是在整个游戏场景中这个物体同样存在。为了优化效率,这里就需要使用遮挡剔除。

Lod

如果一个物体离我们的Camera很远,我们自然就看不见这个物体(或者只能看见一个“小点”)。但是这个物体在场景中仍然会根据它的顶点结构进行渲染并消耗性能。这时候为了优化,如果它离我们的Camera距离很远,我们就不需要对它进行渲染,也就是Lod。

Occlusion Culling(遮挡剔除)

img

遮挡剔除功能在Unity中使用Occlusion Culling(遮挡剔除)组件来进行实现

  • 首先我们需要对需要进行遮挡以及被遮挡的物体进行烘焙。
  • 在烘焙的时候,我们需要对遮挡的物体和被遮挡的物体进行选择不同的情况不同的解决方案。(比如一个玻璃物体遮挡住了另一个物体这时我们也应该对玻璃后的物体进行渲染)
  • 这里不考虑这种情况,直接进行烘焙。

Lod

  • Lod功能,unity内置的组件也会为我们提供了一套解决方案。(LOD Group组件)

  • 首先我们先创建一个小球,可以看见camera已经距离很远,此时只能看见一个小点。但它仍然是场景中进行了渲染。

  • 实现LOD优化,为它添加LOD Group组件。

img

  • 其中LOD 0,LOD 1分别为Camera距离这个球的距离区域划分。
  • 我们可以在这些相对距离区域中选择是否要在这个距离对小球渲染。

以上方案的缺陷。

  • 以上完成的操作都是静态的物体,但是在我们的实际项目开发中,NPC,Monster,建筑物等都是动态生成的。这种情况肯定就无法烘焙成静态的。

动态解决方案。(LOD)

  • 这时我们使用脚本来控制。而LOD的核心也就是在距离远的时候将小球的MeshRender组件失活我们根据这个核心点去编写代码。
    • 为我们的Camera添加一个LODAndOcclusionController的脚本。
    • 完成简单的动态LOD功能。

img

场景测试。

  • 这时我们可以发现当Camera和小球的距离超过5米的时候,小球则不会进行渲染。小球是动态运动的也同样没有关系。

动态解决方案。(遮挡剔除)

  • 使用Ray射线来进行判断。

  • 我们将所有需要进行遮罩剔除的物体添加Tag为Occlusion。

  • 并为我们的Camera添加脚本。

img

总结:

我们的LOD以及Occlusion,都是基于GameObject的MeshRender组件来实现的。只有掌握好核心点,不让它们进行渲染,这样减少了Draw Call自然就优化了性能。(主要为什么是让MeshRender组件失活,因为我们直接把整个游戏对象都失活了,那所有的碰撞信息也全部都会失效。)

作者:Levi_Wan

链接:https://www.jianshu.com/p/be81fd0a9380

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。