跳轉到內容

GLSL 程式設計/Unity/最小著色器

來自華夏公益教科書,開放世界開放書籍

本教程介紹了在 Unity 中建立最小 GLSL 著色器的基本步驟。

啟動 Unity 並建立一個新專案

[編輯 | 編輯原始碼]

下載並啟動 Unity 後(Windows 使用者必須使用命令列引數-force-opengl ),您可能會看到一個空專案。如果不是,您應該透過從選單中選擇檔案 > 新專案...來建立一個新專案。對於本教程,您不需要匯入任何包,但一些更高階的教程需要指令碼和天空盒包。在 Windows 上建立新專案後,Unity 可能會在沒有 OpenGL 支援的情況下啟動;因此,Windows 使用者應始終在建立新專案後退出 Unity 並重新啟動它(使用命令列引數-force-opengl )。然後,您可以透過從選單中選擇檔案 > 開啟專案...來開啟新專案。

如果您不熟悉 Unity 的場景檢視、層次結構檢視、專案檢視和檢查器檢視,現在是閱讀 Unity 使用者指南 的前兩個(或三個)部分(“Unity 基礎”和“構建場景”)的最佳時機。

建立著色器

[編輯 | 編輯原始碼]

建立 GLSL 著色器並不複雜:在專案檢視中,點選建立並選擇著色器。一個名為“NewShader”的新檔案應出現在專案檢視中。雙擊它開啟它(或右鍵單擊並選擇開啟)。將出現一個包含 Cg 中預設著色器的編輯器。刪除所有文字,並將以下著色器複製並貼上到此檔案中

Shader "GLSL basic shader" { // defines the name of the shader 
   SubShader { // Unity chooses the subshader that fits the GPU best
      Pass { // some shaders require multiple passes
         GLSLPROGRAM // here begins the part in Unity's GLSL

         #ifdef VERTEX // here begins the vertex shader

         void main() // all vertex shaders define a main() function
         {
            gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
               // this line transforms the predefined attribute 
               // gl_Vertex of type vec4 with the predefined
               // uniform gl_ModelViewProjectionMatrix of type mat4
               // and stores the result in the predefined output 
               // variable gl_Position of type vec4.
         }

         #endif // here ends the definition of the vertex shader


         #ifdef FRAGMENT // here begins the fragment shader

         void main() // all fragment shaders define a main() function
         {
            gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
               // this fragment shader just sets the output color 
               // to opaque red (red = 1.0, green = 0.0, blue = 0.0, 
               // alpha = 1.0)
         }

         #endif // here ends the definition of the fragment shader

         ENDGLSL // here ends the part in GLSL 
      }
   }
}

儲存著色器(透過點選儲存圖示或從編輯器的選單中選擇檔案 > 儲存)。

恭喜您,您剛剛在 Unity 中建立了一個著色器。如果您願意,可以透過單擊名稱、輸入新名稱並按回車鍵來重新命名專案檢視中的著色器檔案。(重新命名後,重新開啟編輯器中的著色器以確保您正在編輯正確的檔案。)

不幸的是,在將著色器附加到材質之前,您什麼也看不到。

建立材質並附加著色器

[編輯 | 編輯原始碼]

要建立材質,請返回 Unity 並透過在專案檢視中點選建立並選擇材質來建立一個新材質。一個名為“New Material”的新材質應出現在專案檢視中。(您可以像著色器一樣重新命名它。)如果它沒有被選中,請透過點選選擇它。有關材質的詳細資訊現在將顯示在檢查器檢視中。為了將著色器設定為該材質,您可以

  • 專案檢視中的著色器拖放到材質上,或者
  • 專案檢視中選擇材質,然後在檢查器檢視中從標記為著色器的下拉列表中選擇著色器(在本例中為“GLSL 基本著色器”,如上面的著色器程式碼中所指定)。

無論哪種情況,材質的檢查器檢視中的預覽現在都應顯示一個紅色球體。如果它沒有顯示,並且 Unity 視窗底部顯示錯誤訊息,您應該重新開啟著色器,並在編輯器中檢查文字是否與上面給出的文字相同。Windows 使用者應確保透過使用命令列引數-force-opengl重新啟動 Unity 來支援 OpenGL。

互動式編輯著色器

[編輯 | 編輯原始碼]

現在是玩弄著色器的好時機;特別是,您可以輕鬆地更改計算的片段顏色。透過開啟著色器並將片段著色器替換為此程式碼來嘗試霓虹綠色

         #ifdef FRAGMENT 

         void main()
         {
            gl_FragColor = vec4(0.6, 1.0, 0.0, 1.0); 
               // red = 0.6, green = 1.0, blue = 0.0, alpha = 1.0
         }

         #endif

您必須在編輯器中儲存程式碼並再次啟用 Unity 視窗以應用新的著色器。如果您在專案檢視中選擇材質,檢查器檢視中的球體現在應為綠色。您也可以嘗試修改紅色、綠色和藍色元件以找到最溫暖的橙色或最深的藍色。(實際上,有一部關於尋找最溫暖的橙色的 電影 和一部關於幾乎是黑色的深藍色的 另一部 電影。)

您也可以玩弄頂點著色器,例如嘗試此頂點著色器

         #ifdef VERTEX
 
         void main() 
         {
            gl_Position = gl_ModelViewProjectionMatrix 
            * (vec4(1.0, 0.1, 1.0, 1.0) * gl_Vertex);
         }
 
         #endif

這將透過將 座標乘以 來使任何輸入幾何體變平。(這是一個分量級的向量積;有關 GLSL 中向量和矩陣的更多資訊,請參閱 “向量和矩陣運算”部分 的討論。)

如果著色器無法編譯,Unity 將在 Unity 視窗底部顯示一條錯誤訊息,並將材質顯示為亮紫色。為了檢視所有錯誤訊息和警告,您應該在專案檢視中選擇著色器,並在檢查器檢視中閱讀訊息,其中還包括行號,您可以在文字編輯器中透過在文字編輯器選單中選擇檢視 > 行號來顯示這些行號。您也可以透過從選單中選擇視窗 > 控制檯來開啟控制檯檢視,但這不會顯示所有錯誤訊息,因此通常不會報告關鍵錯誤。

將材質附加到遊戲物件

[編輯 | 編輯原始碼]

我們還有最後一步要走:將新材質附加到三角形網格。為此,請透過從選單中選擇遊戲物件 > 建立其他 > 球體來建立一個球體(它是 Unity 的預定義遊戲物件之一)。一個球體應出現在場景檢視中,標籤“球體”應出現在層次結構檢視中。(如果它沒有出現在場景檢視中,請在層次結構檢視中點選它,將滑鼠懸停在場景檢視上,然後按“f”。球體現在應該出現在場景檢視的中心。)

要將材質附加到新球體,您可以

  • 專案檢視中的材質拖放到層次結構檢視中的球體上,或者
  • 專案檢視中的材質拖放到場景檢視中的球體上,或者
  • 層次結構檢視中選擇球體,在檢查器檢視中找到網格渲染器元件(如果它沒有開啟,請透過點選標題開啟它),透過點選開啟網格渲染器的材質設定。透過點選材質名稱右側的點狀圓圈圖示並將新材質從彈出視窗中選擇,將“Default-Diffuse”材質更改為新材質。

無論哪種情況,場景檢視中的球體現在都應該與材質的檢查器檢視中的預覽具有相同的顏色。更改著色器應(在儲存並切換到 Unity 後)更改場景檢視中球體的外觀。

在場景中儲存您的工作

[編輯 | 編輯原始碼]

還有一件事:您應該將您的工作儲存在“場景”中(通常對應於遊戲關卡)。選擇檔案 > 儲存場景(或檔案 > 另存為...)並在專案的“Assets”目錄中選擇一個檔名。場景檔案應然後出現在專案檢視中,並在您下次開啟專案時可用。

關於術語的另一個說明

[編輯 | 編輯原始碼]

為了避免術語混淆,有必要進行澄清。在 GLSL 中,“著色器”指的是頂點著色器或片段著色器。二者的組合被稱為“程式”。

不幸的是,Unity 將這種程式稱為“著色器”,而在 Unity 中,頂點著色器被稱為“頂點程式”,片段著色器被稱為“片段程式”。

為了避免進一步的混亂,我將使用 Unity 的術語“著色器”來指代 GLSL 程式,即頂點著色器和片段著色器的組合。但是,我將使用 GLSL 術語“頂點著色器”和“片段著色器”,而不是“頂點程式”和“片段程式”。

恭喜你已經完成了本教程!你已經瞭解了以下內容:

  • 如何建立一個著色器。
  • 如何在 Unity 中定義 GLSL 頂點著色器和片段著色器。
  • 如何建立一個材質並將其與著色器繫結。
  • 如何在片段著色器中操作輸出顏色 gl_FragColor
  • 如何在頂點著色器中轉換輸入屬性 gl_Vertex
  • 如何建立一個遊戲物件並將材質與它繫結。

實際上,這些內容相當豐富。

進一步閱讀

[編輯 | 編輯原始碼]

如果你還想了解更多關於:


< GLSL Programming/Unity

除非另有說明,本頁面上的所有示例原始碼均為公有領域。
華夏公益教科書