Unity-著色器資源
著色器是包含顯卡執(zhí)行代碼和指令的資源。?材質(zhì)將引用著色器并設(shè)置其參數(shù)(紋理、顏色等)。
Unity 包含一些在項(xiàng)目中始終可用的內(nèi)置著色器(例如,?標(biāo)準(zhǔn)著色器)。您也可以編寫(xiě)自己的著色器并應(yīng)用后期處理效果。
創(chuàng)建新著色器
要?jiǎng)?chuàng)建新著色器,請(qǐng)從主菜單或?Project 視圖__上下文菜單中 選擇?Assets__ >?Create?>?Shader。著色器是 類(lèi)似于 C# 腳本的文本文件,以 Cg/HLSL 和 ShaderLab 語(yǔ)言的組合編寫(xiě)而成 (請(qǐng)參閱編寫(xiě)著色器頁(yè)面以了解詳細(xì)信息)。

著色器導(dǎo)入設(shè)置
在此檢視面板部分可為著色器指定默認(rèn)紋理。每當(dāng)使用 此著色器創(chuàng)建新材質(zhì)時(shí),都會(huì)自動(dòng)分配 這些紋理。
著色器檢視面板
著色器檢視面板顯示有關(guān)著色器的基本信息(主要是著色器標(biāo)簽), 并允許編譯和檢查低級(jí)編譯代碼。
對(duì)于表面著色器 (Surface Shader),__Show generated code__ 按鈕將顯示 Unity 生成的用于處理光照和陰影的所有代碼。如果確實(shí)想要 自定義生成的代碼,只需將其全部復(fù)制并粘貼回原始著色器文件 并開(kāi)始調(diào)整即可。

Compile and show code?按鈕的彈出菜單可檢查選定平臺(tái) 最終編譯的著色器代碼(例如 Direct3D9 上的程序集,或適用于 OpenGL ES 的 低級(jí)優(yōu)化 GLSL)。此功能在優(yōu)化著色器性能時(shí)非常有用;通常情況下,您會(huì)想知道最后在此處生成了 多少低級(jí)指令。
生成的低級(jí)代碼可用于粘貼到 GPU 著色器性能分析工具(如?AMD GPU ShaderAnalyzer?或?PVRShaderEditor)。
著色器編譯詳細(xì)信息
在著色器導(dǎo)入時(shí),Unity 不會(huì)編譯整個(gè)著色器。這是因?yàn)榇蠖鄶?shù)著色器 內(nèi)部都有很多變體,因此為所有可能的平臺(tái)編譯所有這些變體 將需要很長(zhǎng)時(shí)間。實(shí)際的操作過(guò)程為:
在導(dǎo)入時(shí),僅對(duì)著色器進(jìn)行最低限度的處理(表面著色器生成等)。
只在需要時(shí)實(shí)際編譯著色器變體。
不會(huì)在導(dǎo)入時(shí)執(zhí)行編譯 100–10000 個(gè)內(nèi)部著色器的典型工作,此過(guò)程通常最終只編譯少數(shù)著色器。
在播放器構(gòu)建時(shí),所有“尚未編譯”的著色器變體都將被編譯,因此即使 Editor 不會(huì)使用這些著色器變體,它們也會(huì)存在于游戲數(shù)據(jù)中。
但是,這確實(shí)意味著著色器可能具有在著色器導(dǎo)入時(shí)未檢測(cè)到的 錯(cuò)誤。例如,正在使用 Direct3D 11 運(yùn)行 Editor,但如果著色器是針對(duì) OpenGL 進(jìn)行編譯的, 則會(huì)出錯(cuò)。此外,還可能著色器的某些變體不符合著色器模型 2.0 指令限制等。如果 Editor 需要了解這些錯(cuò)誤,它們將顯示在檢視面板中;但是,為了檢查錯(cuò)誤,手動(dòng)為所需平臺(tái) 完全編譯著色器也是一種很好的做法。使用著色器檢視面板 中的?Compile and show code?彈出菜單即可執(zhí)行此操作。
著色器編譯是使用名為?UnityShaderCompiler
?的后臺(tái)進(jìn)程執(zhí)行的,該進(jìn)程由 Unity 在需要編譯著色器時(shí)即時(shí)啟動(dòng)??蓡?dòng)多個(gè)編譯器進(jìn)程(通常在機(jī)器中每個(gè) CPU 核心對(duì)應(yīng)一個(gè)),這樣在播放器構(gòu)建時(shí)就可以并行完成著色器編譯。當(dāng) Editor 不編譯著色器時(shí),編譯器進(jìn)程不執(zhí)行任何操作,也不消耗計(jì)算機(jī)資源, 所以不必?fù)?dān)心它們。Unity Editor 退出時(shí)也將關(guān)閉這些進(jìn)程。
各個(gè)著色器變體編譯結(jié)果將緩存在項(xiàng)目中的?Library/ShaderCache
?文件夾下。 這意味著 100% 相同的著色器或其代碼片段將重用以前編譯的結(jié)果。此外還 意味著,如果有許多經(jīng)常更改的著色器,著色器緩存文件夾可能會(huì)變得 非常大。刪除文件夾內(nèi)容通常是安全的;只會(huì)導(dǎo)致重新編譯著色器變體。