1. 程式人生 > >Unity 4.x 遮擋剔除技術

Unity 4.x 遮擋剔除技術

遮擋剔除:Occlusion Culling
在使用遮擋剔除時,會在渲染物件被送進渲染流水線之前,將那些因被遮擋而不會被看到的隱藏面或隱藏物件進行剔除,從而減少了每幀的渲染資料量,提高渲染效能。

個人理解:Shader編寫時考慮的深度測試、背面剔除Cull,是GPU階段的;然而這裡說的遮擋剔除技術應該是CPU階段,減少每幀傳給GPU的渲染資料量,以此提高渲染效能。

.

遮擋剔除,當一個物體被其他物體遮擋住而不在攝像機的可視範圍內時不對其進行渲染。.
遮擋剔除在3D圖形計算中並不是自動進行的。因為在絕大多數情況下離 camera 最遠的物體首先被渲染,靠近攝像機的物體後渲染並覆蓋先前渲染的物體(這被稱為重複渲染”overdraw”).
遮擋剔除不同於視錐體剔除. 視錐體剔除只是不渲染攝像機視角範圍外的物體而對於被其他物體遮擋但依然在視角範圍內的物體,則不會被剔除. 注意當你使用遮擋剔除時你依然受益於視錐體剔除(Frustum Culling).

http://blog.csdn.net/yupu56/article/details/76222962

1、在Unity中如何使用遮擋剔除

(1)有哪些東西?

  1. 場景中的static物件
  2. Occlusion Window
  3. 幾個特殊的元件
  4. Camera
  5. 遊戲執行時動態改變的物體

(2)測試場景操作步驟

  1. Window/ Occlusion Window
  2. 選中場景中的static物體,Bake
  3. 將Scene檢視中出現的工具,調整為Visualize
  4. 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); } }