Unity距离剪裁实现方法

发表于2015-09-18
评论0 4.7k浏览
Unity距离剪裁实现方法

一.   距离剪裁希望达到的效果

我们希望通过距离剪裁,来剔除掉某些距离观察点较远的物体。一个例子便是远景中体积比较小的物体,我们希望剔除它的同时依然渲染在相同位置的体积较大的物体。

 

二.   Unity中实现距离裁剪的方法

1.                   脚本代码中实现

在对象做更新时,检测离camera的距离,如果过大则将renderer禁用。或者是用专门的相机渲染特定物体,将其far clipping panel设置成较小值。这两种方法的问题就在于额外的运行时计算开销。

2.                   使用UnityCamera.layerCullDistances

这个特性允许我们对所有layer分别设置一个剔除距离,但是不能够针对单个对象进行设置。由于很多逻辑功能都依赖于分层(例如Line check),我们很难专门为距离裁剪来定制分层方式。

具体使用方法请参考:

需要说明的是,layerCullDistances设置的值需要小于等于当前camerafar clipping panel值,否则无效。

3.                   使用UnityLOD

使用LOD group component,可以为不同LOD level设置激活条件以及指定不同的renderer,并且可以直接指定剔除条件。具体用法后文会介绍。

 

三.   LOD group component的设置

1.                   添加component

参见图1,在rendering分组下。

1

2.                   属性设置

如图2所示,将属性设置部分分为上下两个区域进行讲解。

l  区域1:设置LOD各个level的激活条件,也可以添加或删除LOD level。这里的条件,也就是彩色条状图中显示的百分比,指的是物体在screen上显示的高度与screen高度的百分比。实际调整值时,请通过scene窗口来实时预览(可以移动彩色条状图上的相机图标来改变相机位置)。

另外可以看到,在这个界面下可以直接指定剔除条件。

l  区域2:为当前选中的LOD level指定render。点击图中的Add按钮来设置。

 

四.   最佳实践

1.       不需要做距离裁剪的对象,不使用LOD

2.       需要做距离裁剪的对象,使用一级LOD,并且这一级LODRender设置为对象本身的Render,如图3所示:

3

3.       LOD level 0Culled状态的切换条件(百分比)可以根据具体情况为每个对象任意设置。

 

五.   补充

后续如果打算使用多个LOD level,则需要关注引擎对于LOD biasmaximum LOD level的控制,相关内容请参考:

http://docs.unity3d.com/Manual/class-QualitySettings.html

 

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