项目研发常用的优化策略——遮挡剔除(Occlusion Culling)

项目研发常用的优化策略——遮挡剔除(Occlusion Culling)

前言:我们在本次的博客中讨论我们游戏项目研发的过程中为解决项目卡顿、死机、移动设备热量高等问题。对于一个Unity初学者来说,或者仅仅满足于项目功能的具体的实现上。而一个中高级的游戏研发人员则绝对不能仅仅满足于此。

一:摄像机的剔除的距离                                                          

Camera.main.layerCullDistances 属性用来设置摄像机基于层的消隐距离。摄像机可以通过层(GameObject.Layer)的方式来设置不同层物体的消隐距离。但是这个距离必须是小于或者等于摄像机的FarClippingPlanes才有效。我们同样在Layer中增加一个层Cube层,属于第8层。如图所示:

(1):在我们的项目中创建一个立方体和球体。并把立方体的Layer设置为Cube,如图所示:

(2):我们创建一个脚本Demo18_OcclusionCulling.cs,并把脚本挂载在摄像机上。脚本代码如下:

 

 

public class Demo18_OcclusionCulling : MonoBehaviour
{

    public Transform Sphere;                        //球体的位置

    void Start()
    {
        //定义大小为32的一维数组,用来存储所有层的剔除信息
        float[] distance = new float[32];
        //设置第九层层的剔除的距离
        distance[8] = Vector3.Distance(transform.position, Sphere.position);
        //将数字赋给摄像机的layerCullDistances
        Camera.main.layerCullDistances = distance;
    }

    void Update()
    {
        //摄像机远离物体进行测试
        transform.Translate(-transform.forward * Time.deltaTime);
    }

}//class_end

(3):进行脚本的测试:当我们运行脚本的时候,当摄像机的距离超过Vector3.Distance(transform.position, Sphere.position);立方体虽然在摄像机的视野范围之内,但是仍然不可见。只有小于这个距离的时候才可以观察到。大家可以自行的测试。

二:遮挡剔除(Occlusion Culling)                                                                   

当场景中包含大量的模型的时候,势必会造成渲染效率的降低(即帧速率FPS的降低)。如果使用遮挡剔除的技术之后,可以使那么被阻挡的物体不被渲染。从而达到提高渲染效率的目的。

基本的原理:遮挡剔除的基本的原理是:在场景的空间中创建一个遮挡区域,该遮挡区域有单元格(Cell)组成,每个单元格构成整个场景遮挡区域的一部分。这些单元格会把整个的场景拆分成对个部分。当摄像机能够看到该单元格的时候,表示该单元格的物体就会被渲染出来。而被其他的单元格挡住的不被摄像机看到的单元格中的物体将不会被渲染。

(1):我们先来构造一个高楼林立的场景(有点丑,大家见谅)。如图所示:

(2):除了把摄像机、直线光、地面,其余的把层级视图中的所有的游戏对象都标记为“遮挡静态”(Occluder Static/Occludee Static),如图所示:

特别提示:当我们选择一个包含多个子对象的父对象,标记为“静态遮挡”的时候,会出现一个弹出窗口,我们一般点击选择“Yes change children”就可以了。 

(3):执行命名菜单:Windows——>"Occlusion Culling",弹出“遮挡剔除”面板,然后点击“Bake”按钮,进行烘培。如图所示:

 

(4):这时候当我们移动摄像机的时候,如果摄像机低头“看”地面时,整个场景中的游戏对象都无须进行渲染。如果所示:

 

总结:关于遮挡剔除,Unity还提供了“Occlusion Area”、“Occlusion Portal”但是在实际的项目中实用价值不高,顾再次不做详细的介绍。

 

 

转载于:https://www.cnblogs.com/MoRanQianXiao/p/7821126.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 完美剔除遮挡剔除都是计算机图形学中的优化技术,目的是在场景中只渲染可见的物体,从而提高渲染效率。 完美剔除是指通过检测物体是否在视野内来剔除不需要渲染的物体。这种剔除方式需要使用一系列算法来检测物体是否可见,包括视锥剔除、反向相交剔除等等。完美剔除的优点是可以剔除不必要的渲染,从而提高帧率和性能,但同时也需要较大的计算开销。 遮挡剔除则是在完美剔除的基础上,通过对物体的相互遮挡关系的检测来进一步提高渲染效率。在遮挡剔除中,通常会使用空间划分树等数据结构来优化遮挡关系的计算。遮挡剔除的优点是可以剔除视线被阻挡的物体,从而降低渲染负载,但是需要在每一帧进行遮挡检测,计算复杂度较高。 总的来说,完美剔除遮挡剔除都是提高渲染效率的有效方法,但具体应用取决于具体的场景和计算需求。 ### 回答2: Perfect culling - occlusion culling,也叫视野遮挡剔除,是计算机图形学中的一项技术,利用算法判断物体是否在视野或视线范围内,决定哪些物体需要渲染,哪些可以被剔除或隐藏,从而加速计算机图形的处理速度和优化渲染。 完美剔除是指完全的剔除,即仅在无需绘制的情况下进行剔除,从而节省系统资源。通过分析场景中的物体和环境,可以减少未被看到的物体的绘制,从而提高帧率和性能。此外,完美剔除还可以消除隐藏物体对深度测试产生的影响,提高渲染质量。 视野遮挡剔除Occlusion Culling)是一种先进的完美剔除技术,它基于场景的几何形状,通过计算相机的视线路径对场景中的物体进行剔除。通常,OC会对游戏场景进行预处理,并将相机的视锥体与场景的几何体进行比较,从而确定哪些物体可以被遮挡,从而进行动态的渲染。 综上所述,完美剔除-视野遮挡剔除是一种计算机图形学中高效的技术,可以显着提高渲染效率和性能,并使绘制的图形更加真实和准确。它在游戏开发、虚拟现实等领域有着广泛的应用前景。 ### 回答3: 完美的剔除技术——遮挡剔除 完美的剔除技术通常包括两种类型,一种是静态剔除,另一种是动态剔除遮挡剔除是一种静态剔除技术,它的基本原理是在场景渲染前,对场景进行逐像素的遮挡分析,找出被遮挡物体,将其剔除掉,只渲染视图内可见的物体,从而达到提高渲染性能的效果。这种技术可以应用于虚拟现实、游戏开发等领域,尤其是对于大规模场景和复杂场景的渲染,遮挡剔除可以显著降低渲染的开销,提高场景的渲染效率。 具体来讲,遮挡剔除通过采用空间分区、视景体裁剪等技术,将场景以及被渲染物体分为多个区域,然后逐个区域对相邻的物体进行深度比较和遮挡分析,找出被遮挡物体,将其剔除掉。如果采用了合适的剔除策略和算法,遮挡剔除可以大幅减少被渲染对象的数量,从而降低了渲染的开销,提高了渲染效率和帧率。 总的来说,遮挡剔除技术在现代计算机图形学中是非常重要的技术之一,它可以有效地提高场景渲染效率,增加场景的视觉真实感和交互性,是图形学领域中不可或缺的技术之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值