遮挡剔除, 当一个物体被其他物体遮挡住而不在摄像机的可视范围内时不对其进行渲染。.遮挡剔除在3D图形计算中并不是自动进行的。因为在绝大多数情况下离 camera 最远的物体首先被渲染,靠近摄像机的物体后渲染并覆盖先前渲染的物体(这被称为重复渲染"overdraw"). 遮挡剔除不同于视锥体剔除. 视锥体剔除只是不渲染摄像机视角范围外的物体而对于被其他物体遮挡但依然在视角范围内的物体,则不会被剔除. 注意当你使用遮挡剔除时你依然受益于视锥体剔除(Frustum Culling).


视锥体剔除


遮挡剔除

遮挡剔除的运行将通过在场景中使用一个虚拟的摄像机来创建一个物体潜在可视性状态(set)的层级。 这些数据可以实时让每个摄像机来确定什么能看见什么看不见。通过这些数据,Unity 将确定只把可以看见的物体送去渲染。这将降低 绘制调用(draw calls) 的数量并增加 游戏的运行效率。

遮挡剔除的数据由单元格(cells)组成, 每个单元格是在整个场景的包围体积的一部分,单元格来自一个二叉树( binary tree),遮挡剔除使用两棵树, 一个给 View Cells (静态物体) ,另一个给 Target Cells (移动物体)。 View Cells 映射到一个定义静态可视物体的索引列表 (精确剔除后的静态物体)。

非常重要的一点是在创建你的物体时要随时注意,因为你需要在物体的大小和单元格的大小间取得一个好的平衡. 理想情况下,不应该有相比于物体,太小的单元格,但同样,物体不应该覆盖许多单元格.有时你可以通过将大的物体拆成几个部分来改进遮挡剔除效果. 然而,你仍然能够将小的物体合并在一起,来降低绘制调用次数(draw calls), 在它们都属于同一个小单元格的时候, 遮挡剔除将不起作用。单元格的集合和可视信息确定哪些单元格是可见的,被认为是 PVS (潜在可视集合Potentially Visible Set)。

Setting up Occlusion Culling 设置遮挡剔除

为了使用遮挡剔除 需要进行相关的手动设置。首先,你关卡中的几何体必须被分割成合理大小的块。这也有助于布置关卡中小块的,明确界定的区域 被其他大物体遮挡(例如墙,建筑物)。这意味着每个单独的网格根据遮挡数据确定是否渲染。所以如果你有一个物体包含了房间里的所有家具,那么所有的家具要么全渲染,要么全不渲染。 使每个家具都有自己的网格,这会有不一样的感觉,那么可以根据摄像机的视点,各个物体可以单独地被剔除。

在检视面板(Inspector) 你需要标识(tag) 所有需要应用遮挡剔除的场景物体。最快的方法是选择多个想要遮挡计算的物体,然后标记它们为Occlusion Static 和 Occludee Static。

Marking an object for Occlusion 为遮挡标记物体

我应该在什么时候使用Occludee Static?透明物体不能遮挡,以及小物件,都不可能阻挡其他的东西,应标记为Occludees,但不遮挡。这意味着它们将被视为能被其他物体遮挡,但不会被视为作为遮挡物自身,这将有助于减少计算量。

Occlusion Culling Window 遮挡剔除窗口

对于大多数涉及遮挡剔除的操作,我们建议您使用遮挡剔除窗口(Window->Occlusion Culling)

在遮挡剔除窗口,您可以使用遮挡物网格和遮挡区域。

如果你是在遮挡剔除窗口的Object标签并在场景有一些Mesh Renderer被选择,你可以修改相关静态标识:


Occlusion Culling Window for a Mesh Renderer

如果你是在遮挡剔除窗口的Object标签并有一个遮挡区域被选择,就可以使用相关OcclusionArea属性(更多细节跳转到遮挡区域章节查看)。


遮挡区域的遮挡剔除窗口

注意:默认如果你没有创建遮挡区域,遮挡剔除将应用到整个场景。

注意:每当相机在遮挡区域之外,遮挡剔除将不应用。重要的是这种遮挡区域覆盖的地方要有相机,但做遮挡区域太大,会导致烘焙更多开销。

Occlusion Culling - Bake 遮挡剔除 - 烘焙


遮挡剔除面板的bake标签

Properties 属性

  • Technique技术
    选择遮挡剔除烘焙的类型
  •     PVS only
    只有静态的物体会遮挡剔除。动态物体只根据视图视锥体被剔除。该技术具有最小的CPU的开销,推荐在很少移动物体和人物的游戏上使用。因为所有的可见性是预先计算的,您不能实时打开或关闭入口。
  •     PVS and dynamic objects
       

    静态对象使用预先计算可见性进行剔除。动态对象使用portal剔除。该技术是实时开销和剔除效率之间很好的平衡。因为所有的可见性是预先计算的,您不能实时打开或关闭入口。
  •     Automatic Portal Generation
        自动生成入口

    入口自动生成。静态和动态物体通过入口剔除。这允许你实时打开和关闭入口。这种技术剔除物体最准确,但CPU的性能开销最大。
  • View Cell Size
    视图单元格大小

    每个视图区域单元格的大小, 大小越小遮挡剔除越精确. 该值是遮挡的准确性和存储大小之间的权衡。 
  • Near Clip Plane
    近裁剪平面

    近裁剪面应该设置最小数值 那么游戏中所有摄像机都可用。
  • Far Clip Plane
    远裁剪平面

    远裁剪面用于剔除物体. 任何物体的距离大于这个设定值都会被自动遮挡.(远裁剪面应该设置为最大的值,可以被游戏里所有的摄像机使用)
  • Memory limit
    内存限制

    这是一个基于PVS烘焙的提示,Automatic Portal Generation 模式下不可用。

当您调整这些值后,您可以点击烘焙Bake 按钮开始处理遮挡剔除数据。如果你不是很满意得到的结果,您可以点击"清除Clear "按钮来删除先前计算的数据。

Occlusion Culling - Visualization 遮挡剔除 - 可视化


遮挡剔除检视面板visualization(可视化) 选项卡

近平面和远平面定义了一个虚拟摄像机来计算遮挡剔除数据。如果你有近平面或者远平面不同的几个摄像机, 你应该把近平面设置为所有摄像机中最小的值和远平面设置为所有摄像机中最大的值,来正确调整物体的包括范围。

场景里的所有物体影响包围体积的大小,请让你的所有物体保持在场景可视范围内。

当你准备好生成遮挡数据, 点击 Bake (烘焙)按钮, 记得选择烘焙(Bake )选项卡的内存限制(Memory Limit )。越小的值,生成越快,精确性越小。较高的值,产品质量更接近发布。

请记住遮挡剔除的数据计算生成速度取决于你设置的cell levels(单元级别), 数据大小大小和质量品质. Unity会在主窗口底部显示 PVS 生成状态.

运算处理结束后, 你会在视图区域看到一些彩色的立方体. 彩色区域是共享遮挡剔除数据的区域.

如果你想删除所有遮挡剔除的事先计算好的数据(预计算数据),点击Clear 按钮.

Occlusion Area 遮挡区域

如果想在运动物体应用遮挡剔除,你必须创建一个Occlusion Area(遮挡区域)然后修改其大小来适应运动物体的活动空间(注意:运动物体不能被标示为静态). 您可以创建遮挡区域,把遮挡区域组件添加到一个空的游戏物体(菜单Component->Rendering->Occlusion Area )

创建遮挡区域( Occlusion Area)后, Is Target Volume  复选框打勾, 来遮挡剔除运动物体。


移动物体的遮挡区域属性

  • Size 大小
    定义遮挡区域大小
  • Center中心
    设定遮挡区域的中心。默认0,0,0 并位于盒子的中心
  • Is View Volume是否视图体
    定义摄像机能到哪里。选中这个选项,来遮挡遮挡区域内的静态物体
  • Is Target Volume是否目标体
    当你想遮挡剔除运动物体时选上。
  • Target Resolution目标分辨率
    确定区域内的遮挡剔除的精度。这影响遮挡区域的单元格大小。注意: 这个选项只对 Target Areas(移动物体)起作用
  •     Low低
    这花费较少的时间来计算,但是不够准确。
  •     Medium中
    平衡准确性和花费时间处理遮挡剔除数据。
  •     High高
    计算时间长但精度高
  •     Very High非常高
    当你想要比高分辨率(high resolutions)更高的精度,使用这个值。注意这会花费更多时间。
  •     Extremely High极高
    使用这个值,当你想在可移动的物体上得到几乎确切的遮挡剔除。 注意:这个设定需要大量的时间来计算。

添加完遮挡区域后, 你需要了解盒子是如何划分成单元格。要查看遮挡区域如何被计算,在遮挡剔除预览面板,选择"编辑Edit "和勾上"视图View "按钮。

测试生成的遮挡

遮挡设置完毕后, 启用遮挡剔除(在遮挡剔除预览面板Occlusion Culling Preview Panel,可视化模式) 并在场景视窗移动主摄像机Main Camera进行测试。


场景视图 中的遮挡 View 模式

当你在左右移动主相机 (无论是否在播放模式下), 你将会看到各种物体禁用自己,你在这里需要找出的是遮挡数据中的任何错误。当你移动摄像机时你可能会发现会有物体突然出现在视野当中,如果这种情况发生, 通过修改分辨率来修复错误(如果是在target volumes模式播放)或左右移动物体左右掩饰错误。要调试遮挡的问题,你可以移动主相机来检查问题的位置。

运算处理结束后,你会在View Area看到一些不同颜色的cube, 蓝色 cubes表示的是Target Volumes 的单元划分, 白色 cubes表示的是 View Volumes的单元划分,如果参数设置正确你会看到一些物体不被渲染,这表示要么这些物体不在摄像机视角范围内要么被其他物体遮挡住了。

如果遮挡完成后,场景内任何物体也没有被遮挡,拆分物体至更小的块,以便它们能被完整地包含在一个单元格中。

Occlusion Portals 遮挡入口

为了创造实时可开启和可关闭的遮挡,Unity使用遮挡入口(Occlusion Portals)。

  • Open打开
    表示入口是否打开(可编写脚本)
  • Center中心
    设定遮挡区域的中心. 默认0,0,0 并位于盒子的中心。
  • Size大小
    定义遮挡区域大小

Unity优化之遮挡剔除Occlusion Culling相关推荐

  1. Unity_7 如何使用遮挡剔除Occlusion Culling

    什么是Occlusion Culling(遮挡剔除) 当一个物体被其他物体遮挡住而不在摄像机的可视范围内时不对其进行渲染. 在绝大多数情况下离 camera 最远的物体首先被渲染,靠近摄像机的物体后渲 ...

  2. 遮挡剔除 Occlusion Culling(转)

    一.首先介绍下draw call(这个东西越少你的游戏跑的越快):  在游戏中每一个被展示的独立的部分都被放在了一个特别的包中,我们称之为"描绘指令"(draw call),然后这 ...

  3. unity 性能优化之遮挡剔除(Occlusion Culling) 官方版

    遮挡剔除 (Occlusion Culling) 功能可在对象因被其他物体遮挡,当前在相机中无法看到时,禁用对象渲染.该功能不会在三维计算机图形中自动开启,因为在大部分情况下,离相机最远的对象最先渲染 ...

  4. unity 性能优化之遮挡剔除(Occlusion Culling)

    1.当场景中包含大量模型时,造成渲染效率的降低(即帧速率FPS的降低),采用遮挡剔除技术,可以使得那些被阻挡的物体不被渲染提高渲染效率 2.原理:在场景空间中创建一个遮挡区域,该遮挡区域是有单元格(C ...

  5. Unity3D-游戏场景优化之遮挡剔除(Occlusion Culling)的使用

    在大型3D游戏场景中,如何优化游戏性能是非常重要的一步.一般遮挡剔除是非常常用的.接下来我们看看如何使用遮挡剔除. 假设这是一个游戏场景. 下面这是相机的视口,相机的视觉是看不到很大立方体后面的那些小 ...

  6. Unity - 遮挡剔除(Occlusion Culling)优化

    遮挡剔除对概念   很多童鞋的Unity作品完成后,发现场景卡的要死,尽管在模型阶段采用了很多优化建模方法,但还是卡顿.电脑端都这么卡,发布到移动端就更不用说了.遇到这种情况,很多童鞋急得团团转,不知 ...

  7. Unity3d遮挡剔除(Occlusion Culling)优化【2019】

    遮挡剔除的概念   很多童鞋的Unity作品完成后,发现场景卡的要死,尽管在模型阶段采用了很多优化建模方法,但还是卡顿.电脑端都这么卡,发布到移动端就更不用说了.遇到这种情况,很多童鞋急得团团转,不知 ...

  8. Unity - 搬砖日志 - Occlusion Culling 关闭动态遮挡剔除 Renderer.allowOcclusionWhenDynamic = false

    文章目录 CullDynamicObjectsWithUmbra 消耗 如何禁止 动态对象的遮挡剔除的消耗 写工具来遍历 Renderer.allowOcclusionWhenDynamic = fa ...

  9. unity学习——遮挡剔除

    unity学习--遮挡剔除 基本概念: "遮挡剔除"过程可防止 Unity 为那些被其他游戏对象完全挡住(遮挡)的游戏对象执行渲染计算. 说白了就是如果摄像机看不见的物体,我就不用 ...

最新文章

  1. Observer Pattern 观察者模式
  2. 皮一皮:千万不要把可乐放冷冻...
  3. TensorFlow2-卷积神经网络
  4. Linux shell script 的语法汇总
  5. 推荐一系列优秀的Android开发源码
  6. MS SQL入门基础:sql 其它命令
  7. 【java基础知识】连接mysql的工具类编写
  8. 世界你好! 个人网站搭建过程
  9. 工作中的第一份LoadRunner脚本
  10. php获取cookie值的方法,怎么获取cookie的值
  11. 北京各区优质高中排名
  12. 计算机怎么玩双人游戏,《双人成行》一台电脑可以两个人一起玩吗 游戏双人玩法详解...
  13. 国内科技巨头的区块链布局:BAT多领域布局,迅雷领跑主链
  14. 平面上点和直线的齐次表示
  15. Android app包下fragment详细使用
  16. DynamicModuleException: MENIFEST.MF文件未找到
  17. 关于数据存储引擎结构,没有比这篇更详细的
  18. 如何debug preloader bootup time 问题以及开机过程中preloader慢抓取 preload模块开机log
  19. 5GNR漫谈1:NR物理层帧结构
  20. 线性回归(Lasso,Ridge,ElasticNet)调参

热门文章

  1. 最新黄金市场价格分析之干掉调整浪
  2. ansible 的任务委派功能(delegate_to)
  3. 17- TensorFlow实现手写数字识别 (tensorflow系列) (项目十七)
  4. 逻辑为基、数企赋能(NO.18):矩形图评估与决策
  5. JVM命令行监控工具之jhat(Java Heap Analysis Tool)
  6. React通过url传参和通过路由传参
  7. WVP+ZLMediaKit实现NAT穿透推流播放录制,支持IPC、NVR、DVR等设备接入,支持GB28181国标级联
  8. 软件测试工程师面试题
  9. Paxos分布式一致性协议
  10. 五:分布式事务一致性协议paxos的应用场景