Unity距离剪裁实现方法
一. 距离剪裁希望达到的效果
我们希望通过距离剪裁,来剔除掉”某些”距离观察点较远的物体。一个例子便是远景中体积比较小的物体,我们希望剔除它的同时依然渲染在相同位置的体积较大的物体。
二. 在Unity中实现距离裁剪的方法
1. 脚本代码中实现
在对象做更新时,检测离camera的距离,如果过大则将renderer禁用。或者是用专门的相机渲染特定物体,将其far clipping panel设置成较小值。这两种方法的问题就在于额外的运行时计算开销。
2. 使用Unity的Camera.layerCullDistances
这个特性允许我们对所有layer分别设置一个剔除距离,但是不能够针对单个对象进行设置。由于很多逻辑功能都依赖于分层(例如Line check),我们很难专门为距离裁剪来定制分层方式。
具体使用方法请参考:
<="" a="">
<="" a="">需要说明的是,layerCullDistances设置的值需要小于等于当前camera的far clipping panel值,否则无效。
<="" a="">3. 使用Unity的LOD
<="" a="">使用LOD group component,可以为不同LOD level设置激活条件以及指定不同的renderer,并且可以直接指定剔除条件。具体用法后文会介绍。
<="" a="">
<="" a="">三. LOD group component的设置
<="" a="">1. 添加component
<="" a="">参见图1,在rendering分组下。
<="" a="">
<="" a="">图1
<="" a="">2. 属性设置
<="" a="">
<="" a="">如图2所示,将属性设置部分分为上下两个区域进行讲解。
<="" a="">l 区域1:设置LOD各个level的激活条件,也可以添加或删除LOD level。这里的条件,也就是彩色条状图中显示的百分比,指的是物体在screen上显示的高度与screen高度的百分比。实际调整值时,请通过scene窗口来实时预览(可以移动彩色条状图上的相机图标来改变相机位置)。
<="" a="">另外可以看到,在这个界面下可以直接指定剔除条件。
<="" a="">l 区域2:为当前选中的LOD level指定render。点击图中的Add按钮来设置。
<="" a="">
<="" a="">四. 最佳实践
<="" a="">1. 不需要做距离裁剪的对象,不使用LOD
<="" a="">2. 需要做距离裁剪的对象,使用一级LOD,并且这一级LOD的Render设置为对象本身的Render,如图3所示:
<="" a="">
<="" a="">图3
<="" a="">3. LOD level 0到Culled状态的切换条件(百分比)可以根据具体情况为每个对象任意设置。
<="" a="">
<="" a="">五. 补充
<="" a="">后续如果打算使用多个LOD level,则需要关注引擎对于LOD bias,maximum LOD level的控制,相关内容请参考:
<="" a="">http://docs.unity3d.com/Manual/class-QualitySettings.html