这是侑虎科技第507篇文章,感谢作者FrankZhou供稿。欢迎转发分享,未经作者授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:793972859)

作者主页:https://www.zhihu.com/people/pkhere,作者也是U Sparkle活动参与者,UWA欢迎更多开发朋友加入U Sparkle开发者计划,这个舞台有你更精彩!


遮挡剔除是当一个物体被其他物体遮挡住而不在摄像机的可视范围内时,不对其进行渲染。在3D图形计算中并不是一个自动进行的过程,因为在绝大多数情况下离相机最远的物体首先被渲染,靠近摄像机的物体后渲染,并覆盖先前渲染的物体(这种重复渲染又叫做"OverDraw"), 它不同于视锥剪裁。

视锥剪裁只是不渲染摄像机视角范围外的物体,而对于那些被其他物体遮挡,但是依然在镜头范围内的物体,则不会被视锥剔除。当你使用遮挡剔除时,视锥裁剪还是会生效的。我们在游戏中主流的Occlusion Culling 方案基本上是以下几种方式:

CPU端:

预计算的原始的PVS

Umbra的dPVS

SoftWare Occlsion

GPU端:

GPU-Driven

Hierarchical Z-Buffering

其他硬件层面:

Early-Z Culling

1.   预计算原始的PVS(UE4自带)

首先划分好格子,然后离线计算每个格子内的所有物体的可见性状态,这里的划格子是用Cell来描述的,格子一般是10M*10M,对于格子内的每个物体都会生成OCID,通过存一个BitArray记录可见性,这样做的好处是内存的占用空间会尽可能小,我们用Unity实现了一遍。

优点:

运行时消耗极低,能有效的降低OverDraw的开销,比较适合开阔的场景,个人认为非常适合目前的手游场景,而且实现比较容易。

缺点:

可见性计算算法一般偏于保守,无法处理动态模型的剔除,可见性烘培的时间较长,需要额外的占用内存,调试工具需要自己开发。

几个注意点:

1)Cell划分和布置:看了下UE4的算法,看平面上Cell尽可能进行等分,高度上的面片是动态计算,在实际操作时候,可以平面上也可以按照密度自适应合并Cell大小,采取用四叉树进行管理划分,高度上也可以分层然后考虑是否进行合并。

2)可视计算烘培:Cell内的可见性物体,根据自己的算法如何来操作。一般做法都比较保守,具体可以参照UE4的实现,蒙特卡洛随机选取,细节在这里就不赘述了。

3)Streaming:如果是大世界,需要考虑到内存的占用和IO的换入换出。看过UE4,它是随着关卡的加载全部加载的。对于Unity中的实现,因为大世界一般采用Streaming方案,所以可以随着Chunk加载卸载去管理,Obect ID就得按Chunk去给,Visible BitArray也一样,保证只有局部的可见性数据,内存比较好控制。

4)所有参数记得按照实际项目进行调优。

UE4中的具体过程参考,这种做法在UE中默认是关闭的,大家可以参考:

http://t.cn/EVj6wtB

2.  UmbradPVS(Unity自带)

这种方式是Unity目前通过Umbra内建的OC方案,虽然也叫PVS,但是看了Umbra创始人Timo Aila的毕业论文,发现和纯离线的原理有很大的区别。它的离线下是不计算所有可见性的,而只是生成一个空间数据结构,也就是一个BSP描述的节点信息,用于之后的空间位置查询。因此它在离线计算的时候速度可以提升很多,但是在线消耗也会提升,因为它还是会产生很多问题,比如跟踪可见物体的标记点,提取轮廓生成HOM等步骤。

优点:

引擎内建使用方便,烘培速度很快,简单易用,调试工具方便。

缺点:

可见性计算算法同样偏于保守,手游上实测运行时CPU消耗不稳定,有时候一帧2-3ms是常事,不支持Streaming大世界内存可观。

Unity中的具体过程参考,大家可以参考:

https://docs.unity3d.com/Manual/OcclusionCulling.html

3.  SoftWare Occlsion

可以直接参考Intel的文章:

https://software.intel.com/en-us/articles/software-occlusion-culling

4.  GPU-Driven

后面的趋势,可以全部采用Compute Shader来做OC,后面对于IB/VB进行合并处理。

优点:

可以用来结合Virtual Texturing和DrawInstanceIndirect,基本可以做到花1-2个DP完成整个场景。

缺点:

定制整个自己的Rending PipeLine,不过后面肯定是趋势。

具体参考鲍鹏对于Siggraph15和GDC16的相关翻译:

https://zhuanlan.zhihu.com/p/33881505

https://zhuanlan.zhihu.com/p/33881861

5.  Early-Z Culling

传统Z-Test其实是发生在PS之后的,因此仅仅依靠Z-Test并不能加快多少渲染速度。而Early-Z Culling则发生在光栅化之后,调用PS之前,这样能提前对深度进行比较,如果测试通过则执行PS,否则跳过此片段/像素(Fragment/Pixel)。需要注意的是:在PS中不能修改深度值,否则Early-Z Culling会被禁用。这个方式是基于硬件的,因此一旦在硬件不支持这个特性的显卡上使用此技术,反而会导致效率下降。目前Geforce 6系列上是支持这个特性的。

总结:

如果是手游不是大世界,且原先CPU的负载就不高,那么第二种方案是可以接受的;如果是大世界,且对于CPU耗时比较抠,那么第一种方案适合;对于Unity就简单粗暴一点,先照着UE顺一遍很快就能出来。如果自己能定制管线,那么CPU的OC方案就可以不用,直接用GPU-Driven。对于优化这件事,在通用引擎上需要自己更细粒度的定制化方案。

文末,再次感谢FrankZhou的分享,如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。

QQ群:793972859

也欢迎大家来积极参与U Sparkle开发者计划,简称“US”,代表你和我,代表UWA和开发者在一起!

UWA DAY 2019火热报名中!

近期精彩回顾

【博物纳新】Unreal中的烟雾火焰流体模拟!

【厚积薄发】Unity UI 显隐(共存)关系的优化处理方案!

【博物纳新】战争迷雾开源库测评!

【厚积薄发】Compute Shader次世代优化方案!

unity3d如何获知场景中需要加载的数据_游戏中遮挡剔除方案总结相关推荐

  1. python requests 动态加载_Python获取网页中动态加载的数据

    Python获取网页中动态加载的数据 0.XHR 是什么? XHR是 XMLHttpRequest 对象.既Ajax功能实现所依赖的对象,在JQuery中的Ajax是对 XHR的封装. 1.查看异步加 ...

  2. 【Unity3D 打斗游戏开发】之二 异步加载场景或预加载资源后进入游戏

    假设当前场景为A,我们要切换到下一场景B,如果使用正常加载方式,Unity会在切换场景时加载场景B的所有内容(Hierarchy面板内容)到内存中,由于加载场景B是同步执行的,所以当场景B较大时,就会 ...

  3. eui加载时间长_游戏加载时间越来越短了?背后藏着这些小心机

    在两大尚未发售的次世代主机中,或许你们还没决定好究竟是选择 PS5 还是 Xbox Series X,但毫无疑问次世代游戏表现已经震撼了所有人.更精美画面表现,更丰富的 HDR 效果,更快速的读取时间 ...

  4. Flutter中ListView加载图片数据的优化

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. ** 你可能需要 CSDN 网易云课堂教程 掘金 EDU学院教程 知乎 Flutter系列文章 在使用ListView ...

  5. 在计算机系统中使用加载器,在个人计算机系统中从软盘加载基本输入/输出系统的设备和方法...

    主权项: 一种从通常接有硬文件的个人计算机系统的软盘驱动器含有的\r\r\r\r\n软盘介质中加载BIOS的设备,该个人计算机系统具有系统\r\r\r\r\n处理器.只读存储器.随机存取存储器和软盘驱 ...

  6. osg加载osgb数据_铁路工程三维协同大数据云平台研究与开发

    铁路工程三维协同大数据云平台是基于3DGIS空间信息平台.BIM云平台.GIM云平台.在线监测云平台及增强现实云平台的多平台融合技术 现代铁路工程建设更加注重BIM.物联网等新技术,构建全生命周期一体 ...

  7. cesium 3dtiles 加载本地数据_记一次Cesium地形数据生成过程

    问题描述 有一小块带高程值的点状数据,需要根据该数据生成Cesium支持的3dtiles数据,在Cesium中显示.经过一周多时间的摸索,终于能够在Cesium中加载成功.现将数据处理流程做个记录,以 ...

  8. cesium 3dtiles 加载本地数据_深入echarts学习:加载跨域、异步、本地json数据的防坑录

    1 说明: ===== 1.1 推荐指数:★★★★ 1.2 网上这方面说明,大多模棱两可,坑很多,讲透彻的不多,故本人做一个小结. 1.3 我曾介绍echarts的简单基本用法: <Echart ...

  9. html页面加载json数据,在html中显示JSON数据的方法

    背景: 有时候我们需要将json数据直接显示在页面上(比如在做一个接口测试的项目,需要将接口返回的结果直接展示),但是如果直接显示字符串,不方便查看.需要格式化一下. 解决方案: 其实JSON.str ...

最新文章

  1. 【资源】100+本数据科学电子书
  2. [YTU]_2911(我想放假)
  3. Leetcode 91. 解码方法 (每日一题 20211013)
  4. dva处理_umi项目中dvaeffects异常统一处理
  5. MySQL的常见存储引擎介绍与参数设置调优
  6. css练习题4,复习webpack4之CSS文件代码分割
  7. libcurl学习及简易封装类
  8. 微信小程序的点击、双击、长按事件
  9. 一不小心,我爆啦!!!
  10. portraiture2023智能磨皮修饰滤镜插件中文版
  11. 软件开发:API和SDK的区别与联系
  12. 人工智能的“斯芬克斯之谜”
  13. matlab 实验四 数据处理与多项式计算
  14. Thinkphp 模型与表名定义
  15. 四五六年级计算机教学计划,三至六年级信息技术教学计划
  16. 网管工具——Untangle
  17. Putty连接阿里云ECS服务器
  18. 贝加莱 C语言编程,贝加莱可编程计算机控制器PCC系列
  19. 主题:含热电联供的智能楼宇群协同能量管理
  20. 遥感图像计算机自动分类原理,遥感图像计算机自动识别ppt课件.ppt

热门文章

  1. java学习笔记-第八章:面向对象编程(中级部分)
  2. 探花交友_第10章_实现推荐功能
  3. 递归-力扣-526. 优美的排列
  4. 电脑杀毒软件推荐之火绒安全
  5. 字符串与16进制的转换
  6. 2022 年 2 月产品大事记
  7. 虚拟机配置静态ip地址(俗称固定ip地址)
  8. Vue中 路由导航守卫(全局守卫、路由独享守卫、组件内守卫)
  9. 格式化字符串漏洞利用时计算的偏移到底是什么?
  10. 一款很好看的个人主页html源码免费下载