在Unity中使用多個相機 及其重要性

2021-08-04 18:58:10 字數 3057 閱讀 1317

據我觀察,很多unity使用者沒有掌握在乙個場景中使用多個unity相機的概念。「如果我只需要乙個視角,為什麼還要多個相機呢?」如果回答說,在同乙個視角使用多個相機能讓場景看起來更完美,這會更加讓人迷惑。為什麼需要這麼麻煩呢?這個原因有些複雜,但是非常值得學習。這能幫助你更簡單的建立更好的視覺效果,而只用乙個相機達到同樣的效果將會非常困難。

什麼是unity相機?

在繼續本文之前,你必須明白unity的攝像機到底是什麼。unity渲染場景的時候需要確定很多重要的資訊,但是讓我們簡化這個列表以便更容易理解。如下:

如果你曾經接觸過這些東西,你可能會注意到我沒有提到矩陣。這裡會先忽略掉數學相關的東西。

要渲染的物體列表是在場景中的所有物體的列表,對嗎?錯!每個相機只渲染它可見(可視區內,視錐體內),並且在它可見的層(裁剪遮罩)內的物體。

裁剪遮罩可以設定為everything,或者你可以只設定想看到的層。這是層的功能之一。

這個相機能看到所有的層。

這個相機只能看到預設層(地面)和紅色的層(紅色的球體)。

結論是,不同的相機可以渲染不同的物體。這是在了解如何實際使用它之前需要知道的重要資訊。這也意味著增加另乙個相機並不會使場景被繪製兩次,而只有對第二個相機可見的物體才會被渲染。也就是說,用多個相機渲染不同的層,與只用乙個相機渲染所有層的渲染效率相差無幾。

現在讓我們回答最開始的問題:相機就是從指定的視角渲染特定物體列表的指令。

相機渲染什麼?

等一下,我們不是已經回答了這個問題了嗎?!其實,還不完全。其實有可見的和不可見的兩個部分。你看到的是最終的影象(我們叫它顏色緩衝)。當然還有個東西是你看不到的,它叫深度緩衝(也叫z緩衝)。

深度緩衝可以簡單地描述為和遊戲螢幕同樣大小的灰度影象,它的每個畫素值都描述了這個畫素到攝像機的距離(坦誠地說這並非絕對正確,但是目前我們先不考慮更加複雜的情況)。gpu使用這個影象來決定將被渲染的畫素應該被處理還是剔除。結果,被其他畫素覆蓋的畫素將不可見(這與真實世界是一樣的)。

上圖:簡單的三維場景  下圖:z緩衝表達

相機順序與清除

在將任何東西渲染到顏色緩衝和深度緩衝中之前,攝像機可以將兩個緩衝都清除,或者只清除深度緩衝。你有沒有注意到unity 5的場景相機會將緩衝清空為天空盒?

還可以有其他一些選項:

看起來好像是這個球體被複製了很多次,讓它看起來像是連線起來的圓管。除此之外,場景中還有另乙個紅色的球體(注意藍色層對相機還是不可見的),遊戲場景的影象看起來是有效的。這裡沒有使用任何影象加工技術,我們就用乙個物體製造出多個複製物體的效果。

之所以會這樣是因為顏色緩衝沒有每幀都清空(上一幀渲染出來的顏色會傳遞給下一幀),深度緩衝也是一樣。深度緩衝記住了一些東西已經被渲染過了,並且在unity渲染下一幀的時候依然保留這些資訊。當球體想要渲染在已經被渲染的影象後面的畫素時,這些不可見的畫素將會被丟棄。當場景中有多個物體並依次渲染時也會發生同樣的事情。

如果還是不明白剛才發生的事情,請現在就停止閱讀並自己動手做一下!建立乙個新場景,新增乙個物體,把相機的清除標誌設定為不清除,然後移動物體或者相機。

這有什麼好處?

假設你根本不想在遊戲中使用這種效果,那這個選項有什麼好處呢?現在建立兩個攝像機。

- blue camera    藍色的相機

藍色相機看起來的樣子

- red camera                   紅色相機

紅色相機看起來的樣子

這裡出現了乙個新的引數:深度。深度定義了相機渲染的順序。深度值越小的相機會越先被渲染。

現在來看看unity如何一步一步的渲染這個場景(不是100%正確,只是為了幫助理解這個過程)

結果是得到乙個看上去和只用乙個相機渲染出來的效果一樣的場景。

那為什麼要這麼麻煩呢?現在我們嘗試把紅色相機的清除標誌從不清除修改為只清除深度緩衝。

看到了嗎?因為深度緩衝被清空了,紅色球不知道它的部分畫素是被遮擋的,所以它會繪製在場景其他物體的前面。也就是說,清空深度緩衝選項會使物體渲染在最前面。這在渲染3d ui元素的時候是非常有用的。

在遊戲「天際」中,以3d物體展示的道具。即使在背景物體距離攝像機很近的時候,他們也能被正確的渲染。

另外乙個有意思的選項是讓相機只渲染特定的層。如下面的截圖所示,把藍色相機選為只渲染blur層:

然後把紅色相機的清除標誌設定為不清除,並且在藍色相機上應用乙個效果:grayscale。

最後,在移動相機的時候,你可能想同時移動所有相機(這也是為什麼要把所有的相機都設定為同乙個遊戲物體的子物體)。但是有時候也可能就是想只移動乙個相機,那就另當別論了。

Unity多個相機混合渲染

渲染層級 1.camera的depth值 2.sortlayer 3.order in layer 三個層級都是值大的遮擋值小的 在場景中新建乙個相機culling mask選擇需要渲染的物體層級 clear flags選擇depth only 例 uicamera,culling mask選擇ui...

在unity中使用spine動畫

可以使用spine製作骨骼動畫來給unity使用。spine提供了unity執行包。執行包的版本一定要和spine版本一致,不然會報錯。匯入spine動畫 由spine匯出的動畫檔案有3個 xx.atlas,xx.json,xx.png。將這三個檔案直接匯入unity會報錯,將xx.atlas改為x...

在Unity中使用全域性變數

建立乙個指令碼,輸入下面的 指令碼不需要新增到任何物體上,globle變數可以跨場景全域性呼叫。using system.collections using system.collections.generic using unityengine public class globle和以前的許多語...