> 技术文档 > 【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用

【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用


注意:考虑到优化的内容比较多,我将该内容分开,并全部整合放在【unity游戏开发——优化篇】专栏里,感兴趣的小伙伴可以前往逐一查看学习。

文章目录

  • 前言
  • 实战
    • 1、确保所有静止的3D物体都标记为`Occluder Static静态遮挡体`和`Occludee Static静态被遮挡体`
    • 2、然后在顶部菜单中找到`遮挡剔除`选项
    • 3、点击“烘焙”
    • 3、若要预览结果,请切换到可视化标签页
    • 4、选中摄像机调整角度查看效果
  • 补充知识
    • 1、烘焙参数介绍
    • 2、遮挡剔除
    • 3、孔洞剔除
    • 4、Occlusion Area自定义遮挡区域
    • 5、Occlusion Portal动态遮挡入口
    • 6、可移动的物体
  • 专栏推荐
  • 完结

前言

遮挡剔除是一种渲染技术,通过不绘制被其他物体遮挡的物体或者隐藏摄像机视角外的物体来提高性能。使用遮挡剔除仅渲染玩家可见部分,这非常适用于静态关卡。

在游戏中,我们没有必要渲染那些看不见的建筑,因为它们对你来说是没意义的。这就是遮挡剔除发挥作用的地方了,它将场景分割成更小的部分,然后检查给定的单元是否能被摄像机看到。如果单元可见,那么其中的物体也是可见的,如果不可见,它们都会被隐藏。

实战

1、确保所有静止的3D物体都标记为Occluder Static静态遮挡体Occludee Static静态被遮挡体

一般来说,小物体通常被用作被遮挡体,因为它们很少覆盖其他物体。而大物体如墙壁则被用作遮挡体

注意:地面也要设置为静态

【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用

2、然后在顶部菜单中找到遮挡剔除选项

【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用

3、点击“烘焙”

【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用

注意:如果上次烘培后,静态物体发生改变,比如修改了位置,可视化效果可能会与当前烘培设置以及遮挡区域放置有出入。所以每次修改都要记得重新进行烘培。

3、若要预览结果,请切换到可视化标签页

【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用

4、选中摄像机调整角度查看效果

在场景视图中,可以看到仅渲染相机能看到的内容,这能帮你很好的提升游戏性能。
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用

补充知识

1、烘焙参数介绍

【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用

  • 最小遮挡物:我们可以设置打算阻挡其他物体可见性的物体的大小。所以如果我们在这里设置一个值,比如0.5。那么所有大于这个值的物体将被视为遮挡者,并隐藏其他物体。最小遮挡物也决定了单元格的大小。较小的值增加了精度,但也增大了遮挡数据的大小。
  • 最小孔:允许Unity在遮挡剔除过程中忽略非常小的洞。这避免了通过非常小的洞渲染那些遮挡物体。比如默认是0.25,也就是墙洞小于等于0.25时,会被看成是一面完整的墙进行遮挡。
  • 背面阈值:背面阈值是一项大小优化,通过视测试背面来减少不必要的细节。如果我们把背面阈值设置为100,不会移除任何背面。如果我们减小这个值,我们就可以决定一个给定单元格中背面可以占多少比例。建议把这个值保持在100,因为通常来说,有效的摄像机位置是看不到很多背面的。除非我们想要在一个非常复杂的场景中减少遮挡数据的大小,例如,位于地形下方和实体对象内部的几何体就可以移除。

2、遮挡剔除

我们创建一个5x5x1大小的物体设置为Occluder Static静态遮挡体,并在它后面创建一些设置为Occludee Static静态被遮挡体的小立方体

注意:地面也要设置为静态

【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用
重新烘培发现,后面的小立方体没有被遮挡剔除
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用
为什么呢?

因为前面我们介绍过最小遮挡物这个参数,默认它是5,那么所有大于这个值的物体才会被视为遮挡者。所以我这我们可以调小这个值,比如改成1,再次点击烘培。

可以看到,遮挡着就起效果了
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用

注意:要记得开启相机的遮挡剔除选项,不然可能不会有效果。虽然它默认就是开启的,但是我感觉还是有必要提醒一下。
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用

3、孔洞剔除

我创建两个立方体,同样设置为Occluder Static静态遮挡体,它们相距1米,模拟孔洞效果
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用
默认情况下,我们肯定不会剔除后面的物体,因为最小孔参数配置是0.25
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用

如果我们把这个值改成1,再进行烘培
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用
可以看到,后面的物体就被遮挡剔除了
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用

4、Occlusion Area自定义遮挡区域

添加自定义遮挡区域
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用
或者自己添加Occlusion Area组件
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用
然后我们可以设置一个区域的边界
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用
前往烘培选项,修改参数,比如这里我修改最小遮挡物为0.1,再点击烘培
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用
效果
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用
多亏这样,在烘焙遮挡区域时,我们可以指定某区域被分成更小的单元格,而其他将被分成更大的单元格。通过使用遮挡区域,我们可以确定哪里精度应该更高,哪里可以更低。

如果我们没有指定这样的区域,而是将整个地形都分成更小的单元格,这会增加烘焙时间和遮挡数据的大小。

这在房子内部尤其有用,因为通常那里的物体比外面更多。
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用

5、Occlusion Portal动态遮挡入口

Occlusion Portal遮挡入口组件是一个特定的盒状组件,可以标记为打开或关闭。记得添加它需要重新进行烘培生效。
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用
如果它是打开的,那么这个体积不会作为遮挡者起作用
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用
而当我们关闭它时,它就像一个遮挡者,并且可以遮挡其后的物体。
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用
它就像是动态的遮挡者,它们不能移动,但可以被打开或关闭,而且每次修改打开或关闭参数不需要重新烘培。

这在房间中有门的情况下很有用。
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用
我们希望门是遮挡者,但在打开门之后,门后面的物体都应该可见。关门关闭它,门后面的物体剔除。

我们可以通过一个简单的脚本来实现这一点。

myOcclusionPortal.open = true;

6、可移动的物体

可移动的物体在运行时可以是遮挡者,但它不能遮挡静态物体。(能被遮挡,但是遮挡不了别人

添加同一个脚本,控制物体往返运动

using UnityEngine;public class PingPongMovement : MonoBehaviour{ [Header(\"移动设置\")] [SerializeField] private float speed = 2f; [SerializeField] private float distance = 5f; private Vector3 startPosition; private void Start() { startPosition = transform.position; } private void Update() { // 使用PingPong函数在0到distance之间来回变化 float x = Mathf.PingPong(Time.time * speed, distance); // 计算新位置 transform.position = startPosition + Vector3.right * x; }}

将脚本挂载在可移动的物体上,并标记为Occludee Static静态被遮挡体

注意:这个动态物体只能被标记为Occludee Static静态被遮挡体,如果标记为Occluder Static静态遮挡体,烘培后,会出现问题,比如遮挡体移开了,但是遮挡效果还在,导致还是看不到后面的物体。所以可移动的物体设置千万不要标记为Occluder Static静态遮挡体

【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用
运行游戏,查看效果
【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能_unity遮挡剔除怎么用


专栏推荐

地址 【unity游戏开发入门到精通——C#篇】 【unity游戏开发入门到精通——unity通用篇】 【unity游戏开发入门到精通——unity3D篇】 【unity游戏开发入门到精通——unity2D篇】 【unity实战】 【制作100个Unity游戏】 【推荐100个unity插件】 【实现100个unity特效】 【unity框架/工具集开发】 【unity游戏开发——模型篇】 【unity游戏开发——InputSystem】 【unity游戏开发——Animator动画】 【unity游戏开发——UGUI】 【unity游戏开发——联网篇】 【unity游戏开发——优化篇】 【unity游戏开发——shader篇】 【unity游戏开发——编辑器扩展】 【unity游戏开发——热更新】 【unity游戏开发——网络】

完结

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
在这里插入图片描述