Occlusion(遮挡剔除)

Occlusion

1.视锥体剔除(Frustum Culling)
  根据摄像机的视见体的范围对场景模型进行剔除操作,在视见体以外的物体不被渲染,但是在视见体中的物体会以离摄像机最远的物体开始渲染,逐渐渲染靠近摄像机的物体。后渲染的物体会覆盖先前渲染的物体。
锥体剔除只剔除摄像机视角范围外的物体而对于被包含在视见体中的其他对象还是会进行渲染,即摄像机看不到的游戏对象也会进行渲染。
2.遮挡剔除(Occlusion Culling)
  剔除视见体以外的游戏对象,并且剔除视见体内被其他游戏对象所遮住的物体。

静态物体的遮挡剔除:

  将需要自动遮挡的对象勾选 为Occluder Static/Occludee Static,然后在 Occlusion 中进行简单的设置 Bake 即可。最后可以在 Visualization 模式下进行测试。

   

Occluder Static: 需要进行遮挡剔除操作的对象勾选;

Occludee Static: 进行遮挡剔除操作的对象为透明或半透明,以及那些不太可能遮挡其他物体的小物体。即能被其他物体遮挡而本身却不会遮挡到其他物体,这将有效减少计算量。

 Smallest Occluder: 该值越小,烘焙的效果越好越精确

 Smallest Hole: 最小的洞

 Backface Threshold: 

Visualization :形象化。在测遮挡剔除效果时选择此项(需要选择一个摄像机)

动态物体的遮挡剔除:

  1.为运动物体的运动范围添加遮挡区域 ,即添加组件 Occlusion Area 进行设置。

  2.将其他静态对象勾选为遮挡剔除静态物体,然后在 Occlution 窗口中进行设置烘焙即可

入口遮挡:

  为了创建可实时开启和关闭的遮挡。上面的静态、动态物体遮挡为引擎自动遮挡,而入口遮挡为人工控制的遮挡(脚本控制)。如下图:

  1.给门添加 Occlusion Portal 组件,不勾选 Open 属性。即门后的物体不渲染。 

  2.Bake 其他静态物体

  3.添加脚本控制

/**
 * 
 *  项目: 遮挡剔除
 *  
 *  功能: Occlusion Portal 的简单应用
 *  
 */
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class OcclusionPortalPractice : MonoBehaviour
{
    private OcclusionPortal _OcclusionPortal;               //遮挡入口
    private Renderer _Renderer;                             //渲染器
    private void Start()
    {
        _OcclusionPortal = GetComponent<OcclusionPortal>();
        _Renderer = GetComponent<Renderer>();
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            _OcclusionPortal.open = true;                   //渲染门后面的内容
            _Renderer.enabled = false;                      //不渲染门
        }
        if (Input.GetKeyDown(KeyCode.D))
        {
            _OcclusionPortal.open = false;                  //不渲染门后面的内容
            _Renderer.enabled = true;                      //渲染门
        }
    }
}

 

  

 

posted @ 2018-07-04 21:27  LiuChangwei  阅读(6811)  评论(0编辑  收藏  举报