unity3d--攝像機

Sly_461發表於2016-09-20

unity3d攝像機

轉載自http://blog.csdn.net/kfqcome/article/details/10159201

主要來自unity3d reference再加上一些自己的理解

一 概述

攝像頭是用於將世界場景投影到螢幕的裝置。可以在場景中放置不限數目的攝像機,它們可以設定成任意的渲染次序,渲染到螢幕上的任意地方。

攝像機實質上是用於將遊戲顯示給玩家看,它們可以被定製,在上面寫指令碼或者掛載到其他物體上面以獲得想象中的各種效果。對於一個猜謎的遊戲,可能只需對遊戲的全部檢視保持攝像機靜止即可。對於第一人稱的射擊遊戲,常會將攝像機掛載到玩家角色上面,將其放置在角色眼睛的高度。對於一個賽車遊戲,可能會讓攝像機跟隨賽車。

可以建立多個攝像機,然後為每一個賦予一個不同的深度值。攝像機是從低深度值到高深度值的次序進行繪製,一個深度值為2的攝像機將會在深度值為1的攝像機繪製之後再繪製。同時可以調整Normalized View Port Rect屬性來調整攝像機檢視在螢幕上的位置大小,使用這個可以建立多個迷你檢視。


二 屬性

1 clear flags

確定螢幕的哪一部分將被清除。

每個攝像機在渲染它檢視的時候都會快取顏色和深度資訊。繪製出來的影象中那部分沒有被繪製到的部分是空白的,預設的情況下會顯示天空盒的顏色。

當使用多個攝像機的時候,每個都在快取中存放了它自己的顏色和深度資訊,在每個相機渲染的時候會累積更多的資料。在場景中任何特定的攝像機渲染其檢視的時候,可以指定清除標誌來清除快取資訊中的不同部分。可選項有sky box,solid color,depth only和dont clear。


<1> Skybox

這是清除標誌的預設設定。螢幕的任何空白部分都會顯示攝像機的天空盒,如何當前攝像機沒有設定天空盒,它會預設使用渲染設定中(Eidt->Render Settings)的天空盒。假如預設渲染設定中也沒有設定天空盒,它會退而使用背景色。可以選擇是否將一個天空盒元件新增到攝像機。

<2> Solid Color

螢幕的任何空白部分都會顯示當前攝像機的背景色

<3> Depth Only

如果想要繪製一個玩家的槍而不讓它在環境中不被裁剪,可以設定一個深度為0的相機來繪製環境,同時另一個深度為1的相機單獨繪製這個武器。武器相機的清除標誌應該設定成Depth Only。這會保持環境的圖形顯示在螢幕上,但是丟棄所有關於每個物件處於3D空間什麼位置的資訊。當槍被繪製的時候,被繪製出來的不透明部分會完全覆蓋現有的被繪製的環境影象,而不管槍離牆壁多近。


為相機使用Depth Only作為清除標誌,會使相機僅僅根據相機的深度資訊來輸出畫面,比如相機深度為N的清除標誌設為Depth only,那麼它的輸出會直接覆蓋在所有深度小於N的相機輸出畫面上,而不管在真實的3D環境中,各種物件的z值如何

<4> Don’t clear

這個模式下不會清除顏色和深度快取。這會導致下一幀會在上一幀的結果上進行繪製,這個模式在遊戲中用得少,一般用於常規的shader中。

不清除的話不過一會螢幕所有的空白區域都會被填滿,完全看不出是什麼東西。


2 Background

在沒有天空盒的時候,當所有的元素繪製完成後剩餘螢幕的顏色,即那些沒有被元素繪製到的螢幕區域顯示的顏色


3 Culling Mask

用於來設定是否剔除處於某一層的物件。Unity場景中的每一個物件,都被分配了一個層,預設為“default”層。開啟層級管理器可以看到初始狀態下分配了8個層,即0-7層是已經被U3D使用,而”default”處於第0層。



攝像機的Culling Mask的可選項就是這些被使用的層,外加兩個完全選項Everthing和Nothing,攝像機Culling Mask的預設選擇是Everything,即不剔除任何層,這個時候所有的層也都被選中,如下圖


假如現在要隱藏處於Background Image層的物件,只需在該列表中取消勾選Background Image即可。


4 Projection

攝像機的投影方式,有透視投影和正交投影兩種。

正交投影:投影線垂直於投影面,也叫平行投影


將攝像機設成正交投影,可以看到它變成了一個立方體



5 Size

當攝像機設成正交投影時,攝像機對應的那個長方體的大小


6 Field of view

視角,透視投影時才有的特性。視角越大,能看到的視野也越大,對應的焦距也越短


7 Clipping Planes

裁剪平面,Near和Far指定了裁剪的區域範圍,即在Near-Far範圍之內的面將被裁剪掉,不進行渲染。

遠近裁剪平面和由Field Of view決定的平面一起構成一個椎體,被稱為相機椎體或視椎體,完全處於該椎體之外的物體將會被剔除,這被稱為椎體剔除。

8 Normalized viewport rect

指定如何將攝像機的檢視繪製到螢幕座標系上(取值範圍為0-1)

X:攝像機檢視在螢幕上被繪製的水平初始位置

Y:攝像機檢視在螢幕上被繪製的垂直初始位置

W:攝像機檢視輸出影象佔螢幕寬度的比例

H:攝像機檢視輸出影象佔螢幕高度的比例

U3D螢幕的座標系是以左下角為座標原點,向右為X軸,向上為Y軸


9 Depth

攝像機在繪製序列中的位置(層級)。有更大深度值的攝像機將會在深度值更小的攝像機上面繪製,即假如兩個相機C1和C2,深度值分別為10和8,假如將攝像機設為在場景中可見,則C1會在C2的上層繪製,會把攝像機C2也繪製到影象中


10 Rendering Path

用於指定攝像機使用哪種渲染方法,有下面幾種

  • Use Player Settings,攝像機會使用在玩家配置裡面指定的渲染路徑

  • Vertex Lit,所有被該攝像機渲染的物件都會被渲染成Vertex-Lit物件

  • Forward,所有的物件都會被渲染為一個材質對應一個通道

  • Deferred Lighting,所有的物件在沒有光照的情況下繪製一次,然後在渲染佇列的末端將所有物件的光照一起繪製,也就是所謂的“延遲光照”技術。


11 Target Texture

可以用於容納攝像機檢視輸出的Render Texture物件的引用,設定這個引用將會禁止攝像機將檢視繪製到螢幕


12 HDR

啟用攝像機的高動態範圍渲染(High Dynamic Range Rendering)



三 示例

示例:在螢幕上顯示一個2D背景圖

做法如下,來自這裡

  • 建立一個新的攝像機,取名為”Background Camera”

  • 建立一個新的GUI貼圖,取名為”Background Image”

  • 單擊Background Image的監視器皮膚的”Layer”下拉按鈕,建立一個新的層,取名為”Background Image”

  • 設定好貼圖Background Image的大小和位置,同時將它的層設定為“Background Image”

  • 選中Background Camera,對它的一些屬性進行這樣的操作:取消勾選Flare Layer和Audio Listener,設定清除標誌為Solid Color,設定深度為-1,先將Culling Mask設為nothing,然後設為Background Image

  • 選中主攝像機,設定清除標誌為Depth Only,將它的Culling Mask裡面的Background Image取消勾選

到此為止,即設定了一個螢幕的背景貼圖。這裡先將背景相機的清除標誌設定為Solid Color,那麼該相機繪圖後的空白區域就會填充背景色,讓後通過設定Culling Mask使其僅僅顯示層”Background Image”,也就是說背景攝像機僅僅繪製背景貼圖,空白部分用背景色填充。然後主攝像機設定Culling Mask使其不繪製背景貼圖,並且將清除標誌設定成Depth Only,因為背景相機的深度為-1,那麼主相機的深度就為0,背景相機先進行繪製,然後主相機進行繪製,主相機繪製出來的不透明的部分會完全覆蓋在前面層級相機的影象上,也就是說主相機的繪製結果會直接覆蓋到背景貼圖上,這就達到了螢幕背景貼圖的效果。


假如要進行滿屏顯示的話,手動調整背景圖的大小顯然是不實際的,應該使用程式碼

backgroundGUITexture.pixelInset.width = Screen.width;

backgroundGUITexture.pixelInset.height = Screen.height;

backgroundGUITexture.pixelInset.x = 0;

backgroundGUITexture.pixelInset.y = 0;

但是由於程式執行的時候可能解析度會發生改變,所以前面的兩句應該設定成和解析度相關的大小

backgroundGUITexture.pixelInset.width = Screen.currentResolution.width;

backgroundGUITexture.pixelInset.height = Screen.currentResolution.height;

相關文章