Unity遮挡剔除(Occlusion Culling)实现

Wesley13
• 阅读 1180

遮挡剔除(Occlusion Culling,以下统称OC

一、是否开启OC性能差异

在场景中放置一定数量的物体,是否开启OC数据比对

1)正常情况下的渲染状态:

Unity遮挡剔除(Occlusion Culling)实现

2)开启OC后的渲染状态:

Unity遮挡剔除(Occlusion Culling)实现

3)是否开启OC数据比对:

 

DrawCalls

TotalBatches

Tris

Verts

FPS

正常情况

37

222

163.8k

119.8k

612

开启OC

6

6

1.0k

5.1k

698

结果****:在场景中开启OC,数据上有明显的差异,开启后的数据明显优于正常情况下的数据。

二、unity OC的使用

物件标记(是否遮挡)

unity的OC只适用于静态物体,静态物体在Bake的过程中会做预处理。静态物体的标记包括灯光、导航,遮挡等。

Unity遮挡剔除(Occlusion Culling)实现

  • 为了较少计算,缩短烘焙时间,我们不必全部勾选。

  • 在遮挡剔除这块分为两种物件类型:遮挡器(Occluders)和遮挡物(Occludees)(遮挡和被遮挡)。大部分情况下是两种一起勾选,当然要确保物体是不透明的,否则不适合成为遮挡器。

  • 物体勾选Occluders staic和Occludees static

设置合适的Bake(烘焙)参数

打开OC面板

 Unity遮挡剔除(Occlusion Culling)实现

  • Smallest Occluder:最小遮挡物的尺寸,该值越小,烘焙的效果越好越精确(过大会导致剔除成功率下降,过小会导致性能问题)。

  • Smallest Hole:如果场景中有带孔的物体需要能被视线穿透(例如墙上的洞, 房间的门),那么需要将Smallest Hole设置为小于孔的直径。

  • Backface threshold:百分比,减少剔除数据大小。大部分情况下不需要修改(默认100%),设置不当会导致剔除错误(可见的物体被剔除了)。

Bake

数据预处理

Unity遮挡剔除(Occlusion Culling)实现

  • clear:清除生成的烘焙数据

  • Bake:生成数据。

bake后会生成一个跟场景名同名的文件夹,保存烘焙后的数据

Unity遮挡剔除(Occlusion Culling)实现

效果预览

选择OC面板的Visualization选项卡,就可以在场景中实时移动摄像机,观察遮挡剔除情况。

Unity遮挡剔除(Occlusion Culling)实现

三、Uinty遮挡剔除实现原理

Unity 的遮挡剔除是通过第三方插件Umbra实现的,Umbra的运作方式可以分为编辑和执行两个阶段。

编辑阶段,在编辑器里Umbra会即时检查可以被看到的物件

  • 首先Umbra会采样游戏场景并透过烘焙(Bake)将场景纪录成为一个资料结构

  • 在制作结构的期间,Umbra会先像素化场景

  • 把一区一区的点归类群组

    Unity遮挡剔除(Occlusion Culling)实现

  • 并把每一区(Cell)合并到传送区(Portal)

    Unity遮挡剔除(Occlusion Culling)实现

  • 再添加一些必要的数据资料就会成为Unity用的遮挡剔除资料

在执行阶段,开启单向检查(不会传回任何false值)。Unity会给Umbra镜头坐标,Umbra会在场景里从镜头到最远的遮挡物中间投射出一条条的线检查可视深度,检测哪些物体是可见的(编辑状态下,检测可见性是实时执行的),并将这些可见资料格式化后从传送区放到缓冲区。

Unity遮挡剔除(Occlusion Culling)实现

四、OC的一些不足

只在相对明显的遮挡关系上有比较显著的效果,因为Umbra运作原理相对保守,因此在物体结构相对复杂且倍数相同的情况下并没有取得太理想的效果,只有视锥体以外的会被剔除。,如下图所示:

Unity遮挡剔除(Occlusion Culling)实现

摄像机只有在固定区域内,遮挡剔除才会起效;超过区域,烘焙的数据就无法计算

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Wesley13 Wesley13
2年前
Unity性能优化
1\.OcclusionCulling遮挡剔除的含义:没有在Camear视野范围内的游戏物体不进行渲染Render(默认情况下,Unity是会渲染所有GameObject,无论Camear是否看得见),例如下图:!(https://docs.unity3d.com/uploads/Main/OcclusionNoCulling.jpg)2\
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这