GLSL 程式設計/Unity
外觀
在 Unity 遊戲引擎中進行 GLSL 程式設計比在 OpenGL、OpenGL ES 或 WebGL 應用程式中進行 GLSL 程式設計要容易得多。網格和影像(即紋理)的匯入受圖形使用者介面的支援;可以自動計算mipmap 和法線貼圖;大多數常見的頂點屬性和制服都是預定義的;OpenGL 狀態可以透過非常簡單的命令設定;等等。
可以在 Unity 的下載頁面 下載 Unity 的免費版本,適用於 Windows 和 MacOS。所有包含的教程都適用於免費版本。需要注意三點
- 首先,Windows 使用者必須使用命令列引數
-force-opengl[1] 在啟動 Unity 時才能使用 GLSL 著色器;例如,透過將桌面圖示屬性中的Target設定更改為:"C:\Program Files\Unity\Editor\Unity.exe" -force-opengl。(在 MacOS X 上,預設情況下使用 OpenGL,因此也使用 GLSL。)請注意,在 Windows 上在 Web 瀏覽器中執行的 Unity 應用程式中無法使用 GLSL 著色器。 - 其次,這部分假設讀者對 Unity 有所瞭解。如果情況並非如此,讀者應該參考 Unity 使用者指南 [2] 的前三個部分(Unity 基礎、構建場景、資源匯入和建立)。
- 此外,Unity 支援與 OpenGL ES 2.0 的 1.0.x 版本類似的 GLSL 版本(規範可在 “Khronos OpenGL ES API Registry” 獲得);但是,Unity 的著色器文件 [3] 側重於用 Unity 自己的“表面著色器”格式和 Cg/HLSL [4] 編寫的著色器。只有很少的特定於 GLSL 著色器的細節被記錄在案 [5]。因此,本華夏公益教科書可能也有助於彌補 Unity 文件中的一些空白。但是,通常不討論最佳化(例如,參見 此部落格)。
請注意,教程假設你按照此處介紹的順序閱讀它們,即每個教程都假設你熟悉前一個教程介紹的概念和技術。如果你不熟悉 GLSL 或 Unity,你至少應該通讀“基礎”部分的教程。(現在你被警告了!)
- 漫反射(關於每個頂點的漫反射光照和不同型別的多盞光源)
- 鏡面高光(關於每個頂點的光照)
- 雙面表面(關於雙面每個頂點的光照)
- 平滑鏡面高光(關於每個畫素的光照)
- 雙面平滑表面(關於雙面每個畫素的光照)
- 多盞光源(關於在一次著色器通道中處理多盞光源的 for 迴圈)
- 拉絲金屬(關於各向異性鏡面反射)
- 輪廓上的鏡面高光(關於鏡面反射的菲涅爾係數)
- 天空光的漫反射(關於半球光照)
- 半透明表面(關於背光漫射和前向散射透射)
- 半透明物體(關於降低對比度的漫射光照和輪廓上的漫射背光透射)
- 球體的軟陰影(關於渲染球體的本影和半影)
- 卡通渲染(關於非真實感渲染)
- 螢幕疊加(關於從物體空間到螢幕空間的直接變換)
- 廣告牌(關於物體檢視對齊投影)
- 非線性形變(關於頂點混合)
- 平面上的陰影(關於將陰影投影到平面上)
- 鏡子(關於映象物體和使用 alpha 緩衝區進行模板化)
一些額外的關於在沒有著色器的情況下在 Unity 中進行圖形程式設計的教程可在 Cg 程式設計華夏公益教科書中找到。
- Unity 著色器參考:http://unity3d.com/support/documentation/Components/SL-Reference.html
- Unity 中的 Cg 著色器(包括內建著色器):http://www.unifycommunity.com/wiki/index.php?title=Shaders#Unity_3.x_Shaders
- Unity 使用者論壇關於著色器:http://forum.unity3d.com/forums/16-ShaderLab
- 關於最佳化 iOS 著色器的部落格文章:http://aras-p.info/blog/2011/02/01/ios-shader-tricks-or-its-2001-all-over-again/
- 關於 SIGGRAPH 上關於著色器最佳化的演示的部落格文章:http://blogs.unity3d.com/2011/08/18/fast-mobile-shaders-talk-at-siggraph/
- 用於分析 PowerVR GPU(例如所有 iOS 裝置)上著色器效能的工具:http://www.imgtec.com/powervr/insider/powervr-pvrshaman.asp
除非另有說明,本頁面的所有示例原始碼都授予公有領域。