GLSL Programming/Unity/Minimal Shader

維基教科書,自由的教學讀本

本教程包含了在Unity中建立一個最小GLSLshader的基本步驟.

開始Unity並建立一個工程[編輯]

下載完並打開Unity(Windows用戶需要使用命名行-force-opengl),將見到一個新項目.如果沒有,通過菜單File > New Project...來建新項目.本教程不需導入任何包但一些高級教程需要導入scripts和sky boxes包.在Windows建完項目後,Unity可能沒有啟用OpenGL支持;因此,Windows用戶應該退出並用命令行參數-force-opengl重啟Unity.之後從菜單File > Open Project...打開項目.

如果不熟悉Unity的Scene,Hierarchy,Project和Inspector窗口,最好花點時間來閱讀下Unity的用戶指南(「Unity Basics」 和 「Building Scenes」)開始的章節.

創建一個 Shader[編輯]

建立GLSL shader很簡單,Project View中點擊Create,選Shader.Project中將出現名為"NewShader"的文件.雙擊來打開(或右鍵選Open).將出現一個編輯器,裡面有默認的Cg代碼.刪除全部的文本,將下面的shader粘貼過來.

Shader "GLSL basic shader" { // 定义shader的名字
   SubShader { // Unity 选择最符合GPU的SubShader
      Pass { // 有些shader需要多个pass
         GLSLPROGRAM // 这里开始 Unity的 GLSL部分

         #ifdef VERTEX // 这里开始顶点 shader

         void main() // 所有的顶点shader定义一个 main() 方法
         {
            gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
               // 此行将预定义的类型为vec4,gl_Vertex属性,
               //用mat4的gl_ModelViewProjectionMatrix进行变换.
               //将结果存放在预定义vec4类型的输出变量gl_Position
         }

         #endif // 这里结束顶点shader的定义


         #ifdef FRAGMENT // 这里开始片段shader

         void main() // 所有的片段shader定义一个 main() 方法
         {
            gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
               //此片段shader仅仅设置输出颜色为不透明红色(红=1.0,绿=1.0,蓝=0.0,透明=1.0)
         }

         #endif // 这里结束片段shader定义

         ENDGLSL // 这里结束GLSL部分
      }
   }
}

保存shader(單擊保存圖標或菜單選File > Save).

恭喜,你已經在Unity中建立了一個shader.你還可以在Project中重命名shader文件.(重命名完畢,重開編輯器中的shader確保你編輯的是正確的文件).

不幸的話,現在還什麼都看不到,除非將shader附加到材質上.

建立材質並附加shader[編輯]

為了建立材質,返回Unity,在Project中點擊CreateMaterial. Project中將出現一個名字為"New Material"的材質.(可以如shader那樣重命名.) 通過單擊來選中新材質,如果沒選中的話. Inspector中將出現材質的細節.通過下面的操作將shader附加到材質上.

  • Project中拖放shader到材質上或
  • Project中選擇材質,然後在InspectorShader下拉列表中選shader(本教程shader的名字為"GLSL basic shader").

不論如何操作,材質Inspector中Preview應該顯示紅色的球體. 如果沒顯示並且Unity窗口底部顯示了一個錯誤信息,你應該打開shader編輯器,查看shader代碼跟上面給出的是否一致. Windows用戶應該用命令行-force-opengl來重開Unity,以開啟OpenGL的支持.

交互編輯 Shaders[編輯]

這是一個玩shader的好機會;尤其是,可以容易的改變片段的顏色.嘗試下檸檬綠,打開shader將片段shader的代碼替換為:

         #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

保存shader並切回Unity來生效新shader. 如果在Project中選中了材質,Inspector中現在應該是綠色了. 你也可以嘗試修改紅,綠藍元素來找尋最暖的橙色或最黑的藍色. (實際這裡movie有一個關於找到最暖橙色和another幾乎全黑的黑藍色的視頻)

你也可以嘗試玩下頂點shader,如嘗試下這個頂點shader:

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

這裡通過將乘以,來壓扁所有的幾何體.這是分量級向量乘積; 關於GLSL更多的向量和矩陣,可以看Template:GLSL Programming Unity SectionRef.)

如果shader沒有編譯,Unity窗體底部顯示了一個錯誤信息並且材質變為亮粉色. 為了看到全部的錯誤和警告,應該在Project選中shader,從Inspector中查看信息,這裡也含有行號,通過文本編輯器菜單View > Line Numbers來顯示行號.

可以從Window > Console打開Console,但這裡不會顯示全部的錯誤信息並且經常不報告重要的錯誤.

附加材質到GameObject[編輯]

我們還需要一個重要的步驟:附加新的材質到三角網格.為此,點擊菜單GameObject > Create Other > Sphere來創建一個球體(是Unity預建的遊戲物體). Scene中應該出現了一個球體並且Hierarchy中出現名為"Sphere"的條目(如果Scene中沒出現,在Hierarchy中單擊球體條目,移動(不要點擊)鼠標到Scene然後按"f". 球體現在應該出現在Scene中心了.

將材質賦予球體,可以通過:

  • Project中拖放材質到Hierarchy的球體上 或
  • Project中拖放材質到Scene的球體上 或
  • Hierarchy中選擇球體,定位到Inspector中的Mesh Renderer組件(點擊小三角展開如果沒展開),點擊展開MeshRenderer的Materials設置.點擊右側點圓形圖標,從下拉列表中將"Default-Diffuse"材質改變為新的材質.

無論如何,Scene中的球體的顏色應該與Inspector中材質預覽的顏色一致了.改變shader(保持並切回Unity)應該改正Scene中球體的外觀.

將工作成果保存到場景[編輯]

這裡還有一件事:你應該將你完成的工作保存到"場景"(場景通常代表的是一個關卡).選擇File > Save Scene(或File > Save Scene As ...)並在項目的"Assets"目錄中選一個文件名. 之後,場景文件應該出現在Project中,下次打開項目時將可用.

還有一個術語注意事項[編輯]

澄清下術語可能比較好.在GLSL中,"shader"要麼是頂點shader要麼是片段shader.二者組合被叫做"program".

不同的書,Unity將這種程序稱為"shader",在Unity中頂點shader叫做"vertex program",片段shader被叫做"fragment program".

為了解除混亂,我決定使用Unity的"shader"來稱呼GLSL program,如頂點和片段shader的組合.但是我將使用GLSL的術語,"頂點"shader和"片段"shader來代替"vertex program"和"fragment program".

總結[編輯]

恭喜,你已讀完本教程.你已經看到的幾件事情是:

  • 如何創建一個shader.
  • 在Unity如何定義一個GLSL的頂點和片段shader.
  • 如何創建一個材質並制定shader.
  • 在片段shader中如何操作輸出的顏色gl_FragColor.
  • 在頂點shader中如何變換輸入屬性gl_Vertex.
  • 如何創建一個gameObject並指定一個材質.

實際上,這其中包含有一堆事情.

補充閱讀[編輯]

如果你想知道更多

Template:GLSL Programming BottomNav