提示:仅供参考,有误之处,麻烦大佬指出,不胜感激!
文章目录
- 前言
- 一、遮挡剔除是什么?
- 二、静态遮挡剔除的使用步骤
- 1.标记为遮挡剔除对象
- 2.创建Occlusion Area组件
- 3.烘焙
- 4.Occlusion窗口Bake的参数
- Smallest Occluder
- Smallest Hole
- Backface threshold
- 5.遮挡剔除前后的效果对比
- 没有开启遮挡剔除前:
- 开启遮挡剔除后
- 三、动态遮挡剔除的使用步骤
- 2.设置动态遮挡剔除
- 1.开启Dynamic Occlusion
- 2.挂载Occlusion Portal脚
- 3.烘培
- 四、注意点
- 总结
前言
unity在渲染时,默认只是对模型进行视椎体剔除,也就是在相机显示范围内的物体进行剔除,而遮挡剔除则是,渲染物体被整个遮挡住后,将不参与此帧的渲染,unity虽然内置,但是不默认启用,需要我们进行一些操作,才能够实现当前的操作。
一、遮挡剔除是什么?
Unity 中的遮挡剔除(Occlusion Culling)是一种性能优化技术,它可以帮助开发者减少需要渲染的场景物体数量,从而提高游戏的帧率和流畅度。
遮挡剔除的基本思路是在运行时计算场景中哪些物体被遮挡而不需要被渲染,哪些物体是可见的需要被渲染。这样可以减少渲染所需的时间和开销,提高游戏性能。
Unity 中的遮挡剔除主要有两种方式:静态遮挡剔除和动态遮挡剔除。
静态遮挡剔除(Static Occlusion Culling)是在场景构建时进行的,主要是通过 Unity 自带的预处理工具将场景物体分成一些区域,然后计算这些区域之间的遮挡关系。这种方式适用于静态场景和场景中的大部分物体都是静态的情况。静态遮挡剔除的优点是计算量小,不会对游戏运行时的性能造成太大影响。
动态遮挡剔除(Dynamic Occlusion Culling)则是在游戏运行时进行的,主要是通过摄像机视野和场景中物体之间的遮挡关系来计算需要渲染的物体。这种方式适用于动态场景和场景中有大量动态物体的情况。动态遮挡剔除的优点是可以适应动态变化的场景,但需要计算量较大,可能会对游戏运行时的性能造成一定影响。
二、静态遮挡剔除的使用步骤
1.标记为遮挡剔除对象
同时勾选Occluder Static和Occludee Static 。
Occluder Static 属于静态遮挡物体,设置后,可以遮挡其它物体。
Occludee Static 属于静态被遮挡物体,设置后,可以被其它遮挡物体遮挡。
2.创建Occlusion Area组件
1.Window --Rendering–Occlusion Culling 打开遮挡剔除面板
2.创建Occlusion Area组件
选择到Object,再选择Occlusion Areas,最后点击最下面的Occlusion Areas,创建Occlusion Areas。步骤如下图:
3.创建成功
4.当然也可以创建一个空物体,添加组件Occlusion Area,结果和上面步骤一样。
3.烘焙
选择Bake,点击下方Bake。
4.Occlusion窗口Bake的参数
Smallest Occluder
场景内最小遮挡物的尺寸,设得过大会导致剔除成功率下降,过小会导致性能问题。一般默认就好。
Smallest Hole
如果场景中有带孔的物体需要能被视线穿透(例如墙上的洞, 房间的门),那么需要将Smallest Hole设置为小于孔的直径
一般默认即可。
Backface threshold
本参数的引入是为了减少剔除数据大小,另一方面,设置不当会导致剔除错误(可见的物体被剔除了)。因此,暂时请保持默认值100不变。
工作机制是如果PVS产生的某个cell中观察到的阻挡面是backface的比例大于设定值,那么生成的剔除数据中将不会包含这个cell相关内容,从而降低了数据大小。如果运行时camera移动到该cell内,那么剔除查询结果将会是“Undefined”。
5.遮挡剔除前后的效果对比
没有开启遮挡剔除前:
开启遮挡剔除后
可以很明显看见 三个Cube没有被渲染了,相机发射的绿色范围就是渲染到的范围。
三、动态遮挡剔除的使用步骤
2.设置动态遮挡剔除
1.开启Dynamic Occlusion
对于动态或者可移动的物体,如果需要被遮挡,那么需要在其Mesh Renderer 或者 Skinned Mesh Renderer上面设置即可
2.挂载Occlusion Portal脚
动态加载的物体,要能够遮挡其它物体,需要挂载Occlusion Portal脚本进行实现,添加这个组件的物体必须取消Occluder Static和Occludee Static。
Open勾选则是不启用遮挡剔除,不勾选则是启用遮挡剔除,可以通过代码控制。
3.烘培
选择Bake,点击下方Bake。
烘培和静态剔除的步骤一样。
四、注意点
1.静态剔除的物体,无法移动
2.如果修改了场景,需要Clear,然后重新Bake,才会生效
总结
好记性不如烂笔头!
上一章:链接: Unity 性能优化之GPU Instancing(五)
下一章:Unity 性能优化之光照优化(七)