免責聲明:
實際上我不是Unity專家,我之所以開始更認真地研究Unity,是為了我教的課。但是我必須說,目前來看,Unity可能是原型測試平臺最佳的解決方案之一。
本文不是一篇渲染(工程)教程,而是為那些了解渲染、想要嘗試Unity的人寫的文章,為效果和技術建立原型。
簡介
我特別喜歡用Nvidia的FXComposer來徹底檢驗我的想法,直到現在也很喜歡,但是不幸的是,該產品已經被棄用多年。
從那時起,我開始使用MJP框架,加入了我需要的功能(之後他自己也加上了相應功能),有非常優秀的框架是幾個成熟程式設計師寫的,但是在各種成熟的引擎中,目前Unity看起來是快速原型的最佳選擇。
我喜歡Unity的主要原因是其簡單性。我甚至不能上手Unreal 或者 CryEngine,但我也不怎麼想花時間學它們。另一方面,Unity足夠簡單,你只要打開它就可以開始隨便亂戳,這就是其強大之處。人們經常糾結太多的技術細節,其實優化和細化是相對簡單的,我們應該在實驗階段快速完成!
Unity 基礎
實際上你只需要知道三個主要概念:
1) 項目是由「資產(asset)」組成的 (紋理,網格……)。你只需要把文件拖拽到項目窗口,之後文件就會被拷貝到一個文件夾下,一點元數據是用來描述怎樣處理這些文件的。所有的資產都是熱加載的。腳本 (C# 或者JavaScript 代碼)也是資產!!
2) Unity採用一個場景圖系統(你也可以直接發出繪製命令,在此可以忽略)。你可以把網格拽到場景層級中,之後它們會出現在遊戲和編輯器視圖中,你可以創建光線、攝像頭和各種圖元。
遊戲和編輯器間的區別是:遊戲是通過一個遊戲攝像頭看到的,編輯器可以自由漫步。在遊戲視圖中時,你可以改變對象屬性(如果你已經暫停),但是這些改變是不可保存的(在場景中不是序列化的),但是在編輯器中,改變是保存的。
3) Unity 為任何事物都使用一個組件系統。 C#腳本只是定義了一個類(與腳本文件名相同),它繼承自"MonoBehaviour",並且實現了特定的回調函數。
所有的共有類成員作為可編輯的屬性(可以使用C#注釋自定義),都在組件UI中自動暴露,在場景中可序列化/反序列化。
一個組件可以附屬於任何場景對象(攝像頭,網格,光線……),而且可以訪問/修改對象屬性,在特定時刻執行操作(在渲染前,在場景加載之後、更新之前,在啟用組件時,當繪製調試對象時……)
組件可以在場景中自由改變任何內容,因為有一種方法可以通過名稱、類型等找到對象,也可以創建新對象等等。做一些操作的性能特徵有時是……令人驚訝的,在實際遊戲中,你可能需要緩衝區/緩衝池這樣的東西,但是對於建立原型來講,這是不相干的。
著色器& 渲染
在渲染角度,事情也一樣很簡單。可能對於不熟悉渲染的人來說,最複雜的部分就是著色器系統。
正如大多數引擎一樣,Unity有一個著色器系統,這個系統允許著色器排列自動生成(例如:正向著色器需要按光線類型和陰影排列),而且Unity也需要處理跨平臺問題(從HLSL到GLSL跨平臺編譯)。
通過使用著色器描述「ShaderLab」的小DSL,Unity實現了著色,著色器代碼實際上是嵌入其中的。
Unity還有其他方式可以製造著色器,無需HLSL和一個可以避免寫VS和PS的「表面著色器」系統,但是這對於渲染工程師來講沒什麼意思,所以我也不會詳述了:)
ShaderLab可以設置渲染狀態和聲明渲染參數,當一個材質與一個給定著色器綁定時,後者中可以自動在材質UI中體現出來。我不會詳細描述這個系統,因為你會發現ShaderLab著色東西是很明顯的,但是我會在結尾處給出一些例子。
對於幾何材質來說,過程非常簡單:你需要ShaderLab著色器 (.shader) 資產,一個材質資產與其綁定,之後你可以把它分配給一個網格(拖拽),就完成了。
Unity支持三種渲染系統(目前):VertexLit(是一種正向著色器,沒有多通道,每個對象最多有八個光線),Forward(多通道,一次一道光),Deferred(著色,也有舊系統做「deferred lighting」)。
著色器必須聲明系統已經編碼的內容, Unity把光照信息傳遞給著色器的方式也會基於上述內容改變。
對於後處理材質,你需要一個著色器和一個組件。組件應該是C#腳本,腳本可以附屬於攝像頭,在OnRenderImage回調函數中觸發渲染事件。在一個可以以編程方式創建材質的腳本中,把它綁定到著色器、設置參數,所以不需要再有一個獨立的材質資產。
Unity發布的渲染API非常小,但是創建渲染目標和繪製全屏Quad都非常簡單。如果有多個組件覆寫了OnRenderImage,Unity會自動連結後處理,回調函數會提供一個源和一個目地渲染目標,所以這種連結對於腳本來說是完全透明的。
對於更高級的效果,支持繪製和創建網格(包括網格的頂點屬性)、繪製直接幾何圖形(直線等等,通常用於調試)、甚至做「程序化繪製」(假定頂點是從緩衝區中取出的,沒有附加網格數據的繪製)和分配計算著色器。
當手動使用一個延遲著色器和樣本陰影貼圖時,也可以訪問到g-buffer,但是沒有規定要在創建時改變方式,而且你其實不能訪問到任何基礎圖形API(除非你寫C++插件)。
最後一項要點,在PC上,Unity與RenderDoc 和 Visual Studio集成,更方便調試, 這真不錯。
以上最好可以用實際代碼來解釋, 所以,如果你想要嘗試, 這裡 是一些注釋得很好的樣本著色器(雖然非常基礎/在著色器技巧方面大多數是錯的),都是我在開始教課之前學Unity時做的例子。
【版權聲明】
原文作者未做權利聲明,視為共享智慧財產權進入公共領域,自動獲得授權;
注意:關注了泰鬥微信公眾號,想獲得《用Unity5做一款即時戰略遊戲》等課程觀看權的童鞋,可以聯繫晴天(QQ:986671381)或Lisa(QQ:2109365042),他們會添加你到該課程中,感謝!