本節書摘來自華章計算機《unity着色器和螢幕特效開發秘笈(原書第2版)》一書中的第1章,第1.2節,作者 [英]艾倫朱科尼(alan zucconi)[美]肯尼斯拉默斯(kenneth lammers),譯 占紅來,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
每一個unity開發人員都應該熟悉子產品(component)的概念。遊戲中的所有物體都會包含一系列子產品,這些子產品會影響它的外觀和行為。一般而言腳本(script)會決定物體的行為,而渲染器(renderer)則決定了它在螢幕上呈現出來的外觀。unity有多種渲染器,根據我們想要顯示的物體類型的不同,會使用不同的渲染器。每個3d模型一般都會有一個名為meshrenderer的渲染器。一個物體可以隻有一個渲染器,但是一個渲染器可以有多種材質(material)。每一種材質就是一個着色器呈現出來的外觀,是以着色器也就是3d圖像食物鍊的最後一環。這些子產品之間的關系可以從下圖看出:

了解了這些子產品之間的不同十分有助于我們了解着色器是如何工作的。
在準備學習這一部分時,你需要運作unity 5并且建立一個新的項目(project)。在本書配套的代碼裡面也包含這樣一個初始化好的unity項目,你可以使用這個項目作為基礎,随着後續章節的深入學習來自定義你的着色器。準備好這兩樣東西之後,實時着色的精彩世界已經為你敞開了。
在開始做着色器之前,可以先建立一個小的場景作為基礎。建立場景的步驟是在unity編輯器中選擇gameobject | create empty。在這個場景中,可以建立一個簡單的地平面,再添加幾個球體來供我們的着色器使用,再添加一個平行光來照亮這個場景。建立好場景之後,可以按照如下步驟編寫着色器:
在project标簽頁中,右鍵單擊assets檔案夾,然後選擇create | folder。
将你建立的檔案夾重命名為shaders。重命名方式是右鍵單擊檔案夾,然後從彈出的菜單中選擇rename。或者選中檔案夾後按快捷鍵f2(這也是windows系統下預設的重命名快捷鍵)。
建立另外一個名為materials的檔案夾。
右鍵單擊shaders檔案夾,選擇create | shader。然後右鍵單擊materials檔案夾,選擇create | material。
将新建立的着色器和材質都重命名為standarddiffuse。
在monodevelop(unity預設的腳本編輯器)中輕按兩下打開standarddiffuse着色器。unity會自動打開該編輯器并且顯示對應的着色器代碼。
現在我們需要聲明着色器所在的自定義位置。着色器中的第一行代碼就是我們指定給着色器的自定義路徑,隻有這樣unity才會知道這裡有一個着色器,在給材質指定着色器的時候,該着色器才會出現在下拉菜單中。我們已經将路徑重命名為“cookbookshaders/standarddiffuse”,但是你完全可以按照自己的喜好給它換個名字。現在不用擔心它有任何依賴。在monodevelop中儲存着色器,然後傳回unity編輯器。unity在識别到着色器檔案發生改動時,會自動編譯着色器相關代碼。確定你的着色器代碼是這樣的:
技術上來講,這是一個基于實體基礎渲染(physically-based rendering)的表面着色器。在unity 5中已經将實體基礎渲染作為标準。顧名思義,這種着色器會通過模拟光照到物體上來獲得真實感。如果你使用的是之前版本的unity(比如unity 4),代碼會大不相同。在引入實體基礎渲染之前,unity 4并沒有多少精細技術。關于不同類型着色器的介紹會在本書後面章節中詳細展開。
在建立好着色器之後,我們需要将其關聯到一種材質上。選擇第4步中建立的名為standarddiffuse的材質,從shader下拉菜單中檢視inspector标簽頁,選擇cookbookshaders | standarddiffuse(如果你使用的路徑與本書不同的話,看到的着色器路徑也會有所不同)。這個操作就會将之前的着色器指定給該材質,接下來你就可以将這個材質指定給某個物體了。
做完上述步驟之後的例子應該看起來和下面差不多:
現在還沒什麼好看的,但是我們的着色器開發環境已經準備好了,可以按照需要來修改着色器了。
unity有一些幫助你準備着色器環境的指令,讓你事半功倍。隻需要簡單地單擊幾下就已經準備好了。其實在表面着色器的背後,有很多元素在協同工作。unity使用的是cg着色器語言,但是針對該語言做了很多優化和提升,以幫助你高效地編寫着色器代碼。表面着色器語言更多的是一種基于元件的編碼方式。諸如處理紋理坐标和轉換矩陣的事情,unity都已經為你做好了,是以你不用完完全全從頭開始。放在以前,我們在建立着色器的時候要反反複複地編寫大量重複代碼。随着對表面着色器的了解逐漸深入,你自然會對unity如何使用這些cg語言相關的底層函數來完成底層圖像處理器(gpu)任務感興趣的。
在簡單地修改了一下着色器路徑名之後,我們已經得到了一個可以在unity環境中正常工作的基礎漫反射着色器了。我們隻改了一行代碼,所有的光照和陰影都已經做好了。
unity 5中内建着色器的源代碼是隐藏的,你不能從編輯器中像打開自己的着色器那樣打開這些内建着色器。
在第10章中,我們會深入探讨如何使用這些cginclude來将着色器代碼子產品化。