unity3d攝像機

一 概述


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

        攝像機實質上是用於將遊戲顯示給玩家看,它們可以被定製,在上面寫腳本或者掛載到其他物體上面以獲得想象中的各種效果。對於一個猜謎的遊戲,可能只需對遊戲的全部視圖保持攝像機靜止即可。對於第一人稱的射擊遊戲,常會將攝像機掛載到玩家角色上面,將其放置在角色眼睛的高度。對於一個賽車遊戲,可能會讓攝像機跟隨賽車。
可以創建多個攝像機,然後爲每一個賦予一個不同的深度值。攝像機是從低深度值到高深度值的次序進行繪製,一個深度值爲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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章