UPL9-4——遮挡剔除
UPL9-4——遮挡剔除
遮挡剔除
Unity 默认只会进行视锥剔除,即摄像机视锥外的物体不会渲染,
但是在视锥内,被其他物体挡住的东西仍然会被渲染,而遮挡剔除就是用来弥补这一点的
遮挡剔除(Occlusion Culling)的作用:
- 让被遮挡,不可见的物体不再进入渲染管线
- 减少 DrawCall,顶点处理,像素填充 等开销
- 提升性能,尤其是在室内场景,城市场景,森林 这种遮挡很多的环境
比如:玩家在一个房间里,外面的街道模型其实完全看不到,没有必要渲染他们
如果没有遮挡剔除,这些在摄像机视锥范围内的对象依然会被送进 GPU 渲染,浪费性能
说人话:遮挡剔除弥补了视锥剔除的局限性,让 Unity 可以剔除那些在摄像机视锥内,但是被挡住的对象,这样可以节约 GPU 渲染性能
遮挡剔除的具体内容可见:遮挡剔除 - Unity 手册
遮挡剔除的作用
-
设置需要使用遮挡剔除的对象为遮挡静态对象
-
会遮挡别人的物体(比如建筑、墙体、山体等)——> 设置为 Occluder Static(静态遮挡物)

-
可能被遮挡的物体(比如角色、家具、树木等)——> 设置为 Occludee Static(静态被遮挡物)

注意:动态物体不能作为静态遮挡物 (Occluder Static)
-
-
打开遮挡剔除(Occlusion Culling)窗口
Window → Rendering → Occlusion Culling
在该窗口中进行遮挡数据烘焙

-
摄像机需要开启遮挡剔除功能

遮挡剔除 (Occlusion) 窗口参数
-
Object 页签
Scene Filter(在 Hierarchy 窗口内筛选出场景内特定对象):
-
All(所有对象):
在 Hierarchy 窗口内会显示所有对象,不会筛选,但只有在 Hierarchy 窗口内选择了带 Mesh Renderer 或者 Occlusion Area 对象才会显示内容
-
Renderers(渲染器):
在 Hierarchy 窗口内会筛选出所有的带 Mesh Renderer 的对象,点击其中一个对象会显示如下内容:

此时可以设置该对象是否为 Occluder Static(静态遮挡物)以及 Occludee Static(静态被遮挡物)
-
Occlusion Area(遮挡区域):
在 Hierarchy 窗口内会筛选出所有的带 Occlusion Area 的对象,关于 Occlusion Area,详见下文:Occlusion Area
当未选中任何一个带 Occlusion Area 的对象时,会显示如下内容:

点击 Create New Occlusion Area 即可创建一个新的带 Occlusion Area 的对象
-
-
Bake 页签

-
Set Default parameters:设置为默认值,点击后直接还原下方参数
下方提示:默认参数可确保任意给定场景都能快速计算,并获得良好的遮挡剔除结果。由于这些参数始终与具体场景相关,因此在逐场景基础上对参数进行微调将获得更佳效果。所有参数都依赖于场景的单位尺度,因此在设置默认值之前,必须正确设置单位尺度参数。
-
Smallest Occluder:最小遮挡物
小于该尺寸的物体不会被当作遮挡者
太小的物体(比如椅子腿、路灯杆)即使当作遮挡者,对整体遮挡效果意义不大,反而增加计算复杂度比如:如果设为 5,那么宽高深任意方向小于 5 个单位的物体,不会被烘焙进“遮挡源”
建议:
- 大场景(城市/山体) → 数值设大(比如 5~10)
- 小场景(室内/走廊) → 数值设小(比如 1~2)
-
Smallest Hole:最小孔洞
小于该尺寸的孔洞会被“填上”,不会算作能透过去的空间
避免一些小缝隙(比如窗框、门缝)被计算成“可见路径”,导致不合理的可见性判断比如:如果设为 0.25,那么小于 0.25 单位的洞(例如小裂缝)会被忽略,当成墙壁
建议:
- 室内场景 → 设小一些,保证窗户、门洞能算作可见
- 城市/森林 → 设大一些,忽略不重要的小缝隙
-
Backface Threshold:背面阈值
决定一个物体有多少背面可以参与遮挡。遮挡计算时,通常只考虑物体面向摄像机的正面,但有些情况下,背面(比如反向法线)也能阻挡视线
注意,这里的正面一般指的是我们会观察到的模型的外表面,而背面就是模型的内部面,一般是透明的,也存在部分单面墙,能看到贴图的一面是正面,而透明的一面就是背面
数值范围:0~100%
- 0 → 完全不考虑背面;
- 100 → 所有背面都能参与遮挡
建议: 默认值(100%)就够用,除非场景特殊(比如很多单面平面作为墙)
-
Clear:清除烘焙数据
-
Bake:开始烘焙
-
-
Visualization 页签
当选中该 可视化 (Visualization) 页签,再选择开启遮挡剔除的摄像机时,可以实时的预览遮挡剔除效果
默认 Scene 窗口:

开启遮挡剔除预览后 Scene 窗口:

在 右下角可以设置不同预览效果:

-
Camera Volumes:摄像机空间
启用此选项后,您会看到黄线,这些黄线指示 Unity 为其生成遮挡剔除数据的场景区域。
这取决于场景几何体以及在场景中使用 Occlusion Areas 选项定义的任何视图体积 (View Volumes)。当摄像机在黄线之外时,Unity 不会执行遮挡剔除。您还可以看到灰线,这些灰线指示摄像机当前位置所对应的遮挡剔除数据中的单元格以及当前单元格中的细分。
Smallest Hole 设置定义了单元格内细分的最小大小:值越小,每个单元格产生的细分越多且越小,从而使精度提高并且文件增大。 -
Visibility Lines:可视范围线
启用此选项后,您会看到绿线,这些绿线指示当前选择的摄像机可以看到的内容。
-
Portals:入口
启用此选项后,您可以看到一些线代表遮挡数据中单元格之间的连接。当前可见的入口是当前所选摄像机可以看到的入口。
-
遮挡区域
Occlusion Area 是一个 体积框(Box Volume),用来提示 Unity 的遮挡剔除烘焙系统哪些区域是摄像机可能存在的位置,从而在这一块区域进行精确的遮挡剔除烘焙
我们可以创建一个“盒子”空间,在这个区域内会启用精确的遮挡剔除烘焙计算,它的作用是用于优化性能的,
如果不在场景上添加任何 Occlusion Area,则 Unity 会默认创建一个包含所有 Occluder Static 和 Occludee Static 对象的 Occlusion Area 再烘焙,即所有区域全部精确烘焙
如果场景很大、到处都做精细的遮挡剔除烘焙,可能会导致大量不必要的数据,漫长的烘焙时间,且运行时计算量加大,反而可能拖慢性能,
加上 Occlusion Area(遮挡区域) 后,Unity 只在该区域范围内进行精密的遮挡计算,可以用于精确控制在启用更精确的遮挡剔除
在物体繁多的建筑物内部场景会更有用,也可以在没有 Occluder Static 或 Occludee Static 对象但摄像机可到达的区域使用,确保那块区域的遮挡剔除生效
在 Scene 内拖动绿色框体的白色圆柱体即可调整 Occlusion Area 的边界,Occlusion Area 应该框住摄像机的移动范围

注意:
- 它主要影响静态几何的遮挡剔除
- 可以创建多个 Occlusion Area,把不同场景分开管理

-
Size:遮挡区域包围盒的尺寸
-
Center:遮挡区域包围盒的中心点偏移位置
-
Is View Volume:是否是视图体积(开启才能生效)
视图体积是摄像机可能处于运行时的场景区域,
如果启用此属性,遮挡区域 (Occlusion Area) 将定义视图体积。
如果禁用此属性,遮挡区域 (Occlusion Area) 不会定义视图体积。
必须启用此属性才能使遮挡区域 (Occlusion Area) 生效。
不使用 Occlusion Area 标识的遮挡剔除烘焙结果:

使用 Occlusion Area 标识的遮挡剔除烘焙结果:

可以看到,如果不适用 Occlusion Area 标识,则所有区域的格子密度都较高,而启用烘焙区域后,格子只在 Occlusion Area 框定处附近密度较高
遮挡入口
遮挡入口 (Occlusion Portal) 可以用于在关闭状态下遮挡,而在开启状态下不遮挡的对象
遮挡入口关闭时,它将遮挡其他游戏对象。遮挡入口打开时,它不会遮挡其他游戏对象。
适用于遮挡剔除场景中 门 等的物体,可以在 门 即将打开 或者 完全关闭 时用脚本控制其 open 属性使其启用遮挡
注意:使用 Occlusion Portal 对象不需要设置为 Occluder Static 或 Occludee Static,同时要参与到遮挡剔除的烘焙中

-
Open:入口是否开启
如果开启,则此区域将不进行遮挡剔除,摄像机可透过此入口观察到物体
-
Center:中心点
-
Size:尺寸
假设有这个这样的场景,中间的门是遮挡入口:

当遮挡入口的 Open 属性为 false 时预览遮挡剔除结果:

当遮挡入口的 Open 属性为 true 时预览遮挡剔除结果:

可以看到,遮挡入口可以起到仅在不开启时进行遮挡的效果,适用于场景中的门的场景
