遮挡剔除:Occlusion Culling
在使用遮挡剔除时,会在渲染对象被送进渲染流水线之前,将那些因被遮挡而不会被看到的隐藏面或隐藏对象进行剔除,从而减少了每帧的渲染数据量,提高渲染性能。
个人理解:Shader编写时考虑的深度测试、背面剔除Cull,是GPU阶段的;然而这里说的遮挡剔除技术应该是CPU阶段,减少每帧传给GPU的渲染数据量,以此提高渲染性能。
.
遮挡剔除,当一个物体被其他物体遮挡住而不在摄像机的可视范围内时不对其进行渲染。.
遮挡剔除在3D图形计算中并不是自动进行的。因为在绝大多数情况下离 camera 最远的物体首先被渲染,靠近摄像机的物体后渲染并覆盖先前渲染的物体(这被称为重复渲染”overdraw”).
遮挡剔除不同于视锥体剔除. 视锥体剔除只是不渲染摄像机视角范围外的物体而对于被其他物体遮挡但依然在视角范围内的物体,则不会被剔除. 注意当你使用遮挡剔除时你依然受益于视锥体剔除(Frustum Culling).
http://blog.csdn.net/yupu56/article/details/76222962
1、在Unity中如何使用遮挡剔除
(1)有哪些东西?
- 场景中的static对象
- Occlusion Window
- 几个特殊的组件
- Camera
- 游戏运行时动态改变的物体
(2)测试场景操作步骤
- Window/ Occlusion Window
- 选中场景中的static物体,Bake
- 将Scene视图中出现的工具,调整为Visualize
- Camera默认勾选了Occlusion Culling
2、设置烘焙参数
Set default parameters
Smallest Occluder
Smallest Hole
Backface Threadhold
3、相关组件
Occlusion Area 组件
Occlusion Protals 组件
4、一些需要考虑的细节
5、用于创建测试场景的代码
using UnityEngine;
using System.Collections;
using UnityEditor;
public class CreateSceneGameObjects : Editor
{
[MenuItem("Tools/CreateCubes")]
public static void CreateScene()
{
GameObject go = GameObject.CreatePrimitive (PrimitiveType.Cube) as GameObject;
GameObject floor = Instantiate (go, Vector3.zero, Quaternion.identity)as GameObject ;
floor.transform.localScale = new Vector3 (10f, 0.1f, 10f);
GameObject parent = new GameObject("parent");
float delta = 10f / 8f;
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
GameObject cube = Instantiate(go,new Vector3(-5f+j*delta,0,-5+i*delta),Quaternion.identity)as GameObject;
float randomX = Random.Range(0.8F,1.1F);
float randomY = Random.Range(0.5F,2.6F);
float randomZ = Random.Range(0.8F,1.1F);
cube.transform.localScale = new Vector3(randomX,randomY,randomZ);
cube.transform.position = new Vector3(cube.transform.position.x,
cube.transform.position.y + randomY/2,
cube.transform.position.z);
cube.transform.parent = parent.transform;
}
}
}
[MenuItem("Tools/CreateSpheres")]
public static void CreateSpheres()
{
GameObject go = GameObject.CreatePrimitive (PrimitiveType.Sphere) as GameObject;
GameObject parent = new GameObject("parent");
float delta = 10f / 6f;
for(int z=0;z<10;z++)
{
for(int y=0;y<10;y++)
{
for(int x = 0;x <10;x++)
{
GameObject sph = Instantiate(go,new Vector3(x,y,z),Quaternion.identity)as GameObject;
sph.transform.parent = parent.transform;
}
}
}
//go.SetActive (false);
GameObject.DestroyImmediate (go);
}
}