Cg 程式設計/Unity/最小著色器
本教程涵蓋了在 Unity 中建立最小 Cg 著色器的基本步驟。
下載並啟動 Unity 後,您應該建立一個新專案。選擇“3D”選項,即“使用 Unity 的內建渲染器的空 3D 專案”。對於本教程,您無需匯入任何包。
如果您不熟悉 Unity 的場景檢視、層次結構視窗、專案視窗和檢查器視窗,現在是閱讀 Unity 手冊 前三個部分的最佳時機 (Unity 基礎、資產工作流程 和 主視窗)。
建立 Cg 著色器並不複雜:在 **專案視窗** 中,單擊“+”按鈕(或在右鍵選單中選擇 **建立**)並選擇 **著色器 > 標準表面著色器**。一個名為“NewSurfaceShader”的新檔案應該出現在專案視窗中。雙擊它開啟它(或右鍵單擊並選擇 **開啟**)。一個包含預設著色器(用 Cg 語言編寫)的文字編輯器應該出現。(要更改 Unity 使用的文字編輯器,從主選單中選擇 **編輯 > 首選項 ... > 外部工具**,並更改 **外部指令碼編輯器** 的設定。)
現在,刪除所有文字並將以下著色器複製並貼上到此檔案中
Shader "Cg basic shader" { // defines the name of the shader
SubShader { // Unity chooses the subshader that fits the GPU best
Pass { // some shaders require multiple passes
CGPROGRAM // here begins the part in Unity's Cg
#pragma vertex vert
// this specifies the vert function as the vertex shader
#pragma fragment frag
// this specifies the frag function as the fragment shader
float4 vert(float4 vertexPos : POSITION) : SV_POSITION
// vertex shader
{
return UnityObjectToClipPos(vertexPos);
// this line transforms the vertex input parameter
// and returns it as a nameless vertex output parameter
// (with semantic SV_POSITION)
}
float4 frag(void) : COLOR // fragment shader
{
return float4(1.0, 0.0, 0.0, 1.0);
// this fragment shader returns a nameless fragment
// output parameter (with semantic COLOR) that is set to
// opaque red (red = 1, green = 0, blue = 0, alpha = 1)
}
ENDCG // here ends the part in Cg
}
}
}
儲存著色器(透過單擊儲存圖示或從編輯器的選單中選擇 **檔案 > 儲存**)。
恭喜,您剛剛在 Unity 中建立了一個著色器。如果您願意,您可以透過單擊名稱、鍵入新名稱並按回車鍵來重新命名專案視窗中的著色器檔案。(重新命名後,重新開啟編輯器中的著色器,以確保您正在編輯正確檔案。)
不幸的是,在將著色器附加到材質之前,您什麼也看不到。
要建立材質,請返回 Unity 並透過單擊 **專案視窗** 中的“+”按鈕(或在右鍵選單中選擇 **建立**)並選擇 **材質**(不是 (!)“物理材質”)來建立一個新材質。一個新材質(預設情況下稱為“New Material”)應該出現在專案視窗中。(您可以像著色器一樣重新命名它。)如果它沒有被選中,請透過單擊選擇它。有關材質的詳細資訊現在出現在檢查器視窗中。為了將著色器設定為此材質,您可以
- 將 **專案視窗** 中的著色器拖放到材質上,或者
- 在 **專案視窗** 中選擇材質,然後在 **檢查器視窗** 中從標記為 **著色器** 的下拉列表中選擇著色器(在本例中為著色器程式碼中指定的“Cg basic shader”。
無論哪種情況,材質的檢查器視窗中的預覽現在都應該顯示一個紅色球體;如果沒有,您可能需要單擊檢查器視窗底部的灰色條才能顯示它。如果沒有預覽或球體為亮洋紅色,則應該在 Unity 視窗底部顯示錯誤訊息。在這種情況下,您應該重新開啟著色器並在編輯器中檢查文字是否與上面給出的相同。
現在是玩弄著色器的最佳時機;特別是,您可以輕鬆地更改計算的片段顏色。嘗試使用霓虹綠,方法是開啟著色器並將 frag 函式中的片段著色器替換為以下程式碼
float4 frag(void) : COLOR // fragment shader
{
return float4(0.6, 1.0, 0.0, 1.0);
// (red = 0.6, green = 1.0, blue = 0.0, alpha = 1.0)
}
您必須在編輯器中儲存程式碼並重新啟用 Unity 視窗以應用新的著色器。如果您在專案視窗中選擇材質,檢查器視窗中的球體現在應該是綠色的。您還可以嘗試修改紅色、綠色和藍色元件以找到最溫暖的橙色或最深的藍色。(實際上,有一部關於尋找最溫暖的橙色的電影,還有一部關於幾乎為黑色的深藍色的電影。)
您還可以玩弄 vert 函式中的頂點著色器,例如嘗試以下頂點著色器
float4 vert(float4 vertexPos : POSITION) : SV_POSITION
// vertex shader
{
return UnityObjectToClipPos(float4(1.0, 0.1, 1.0, 1.0) * vertexPos);
}
這透過將 座標乘以 來使任何輸入幾何體變平。(這是一個分量級的向量積;有關 Cg 中向量和矩陣的更多資訊,請參見 “向量和矩陣運算”部分 的討論。)
如果著色器無法編譯,Unity 將在 Unity 視窗底部顯示一條錯誤訊息,並將材質顯示為亮洋紅色。為了檢視所有錯誤訊息和警告,您應該在 **專案視窗** 中選擇著色器,並在 **檢查器視窗** 中閱讀訊息,其中還包括行號。您還可以透過從選單中選擇 **視窗 > 常規 > 控制檯** 來開啟控制檯視窗,但這有時不會顯示所有錯誤訊息,因此有時不會報告關鍵錯誤。
我們還有一個重要的步驟要完成:將新材質附加到三角形網格。為此,請透過從選單中選擇 **遊戲物件 > 3D 物件 > 球體** 來建立一個球體(它是 Unity 的預定義遊戲物件之一)。一個球體應該出現在場景檢視中,標籤“Sphere”應該出現在層次結構視窗中。(如果它沒有出現在場景檢視中,請在層次結構視窗中單擊它,將滑鼠懸停在場景檢視上並按“f”。球體現在應該以居中的方式出現在場景檢視中。)
要將材質附加到新球體,您可以
- 將 **專案視窗** 中的材質拖放到 **層次結構視窗** 中的球體上,或者
- 將 **專案視窗** 中的材質拖放到 **場景檢視** 中的球體上,或者
- 在 **層次結構視窗** 中選擇球體,在 **檢查器視窗** 中找到 **網格渲染器** 元件(如果它沒有開啟,請單擊標題開啟它),透過單擊開啟網格渲染器的 **材質** 設定。透過單擊“元素 0”插槽右側的點狀圓圈圖示並將彈出視窗中選擇新的材質來將“Default-Material”材質更改為新的材質。(或者將新的材質拖放到“元素 0”插槽中。)
無論哪種情況,場景檢視中的球體現在應該與材質的檢查器視窗中的預覽具有相同的顏色。更改著色器應該(在儲存並切換到 Unity 後)更改場景檢視中球體的外觀。
還有一件事:您應該將您的工作儲存在“場景”中(通常對應於遊戲關卡)。選擇檔案>儲存(或檔案>另存為...)並在專案“資源”目錄中選擇一個檔名。場景檔案應該出現在“專案視窗”中,並在您下次開啟專案時可用。
澄清一下術語可能會有所幫助。在一些 API 中,“著色器”要麼是頂點著色器,要麼是片段著色器。兩者的組合被稱為“程式”。在其他 API 中,則剛好相反:“程式”要麼是頂點程式,要麼是片段程式,兩者的組合被稱為“著色器”。不幸的是,Unity 的文件將這兩種約定混合使用。為了簡單起見,我們在這裡儘量避免使用術語“程式”,而是使用術語“著色器”來表示頂點著色器和片段著色器的組合。
恭喜您,您已經完成了本教程。您已經瞭解了一些內容,包括:
- 如何建立著色器。
- 如何在 Unity 中定義 Cg 頂點和片段著色器。
- 如何建立材質並將著色器附加到材質。
- 如何使用片段著色器中的語義
COLOR操作片段輸出引數。 - 如何使用頂點著色器中的語義
POSITION變換頂點輸入引數。 - 如何建立遊戲物件並將材質附加到它。
事實上,這已經涵蓋了很多內容。
如果您想了解更多資訊,
- 關於頂點和片段著色器的一般資訊,請閱讀“可程式設計圖形流水線”一節。
- 關於頂點變換,例如
UnityObjectToClipPos,請閱讀“頂點變換”一節。 - 關於在 Cg 中處理向量(例如
float4型別)和矩陣,請閱讀“向量和矩陣操作”一節。 - 關於 Unity 的 ShaderLab 語言用於指定著色器,請閱讀Unity 的 ShaderLab 參考。