Unity-Unity 中使用的著色語(yǔ)言
在 Unity 中,可使用?HLSL?編程語(yǔ)言來(lái)編寫(xiě)著色器程序。
Unity 最初使用?Cg?語(yǔ)言,因此會(huì)使用 Unity 某些著色器關(guān)鍵字的名稱(chēng) (CGPROGRAM
) 和文件擴(kuò)展名 (.cginc
)。Unity 已不再使用 Cg,但仍支持這些關(guān)鍵字和文件擴(kuò)展名。請(qǐng)注意,所有著色器程序代碼都必須是有效的 HLSL,即使代碼使用與 Cg 相關(guān)的關(guān)鍵字和文件擴(kuò)展名也如此。
使用?HLSLPROGRAM
?與使用?CGPROGRAM
?之間的唯一區(qū)別在于 Unity 在編譯著色器程序時(shí)自動(dòng)包含的文件。這是為了向后兼容。有關(guān)更多信息,請(qǐng)參閱內(nèi)置著色器 include 文件。
HLSL 語(yǔ)法
HLSL 語(yǔ)言本身有兩種語(yǔ)法:“舊版”的 DX9 樣式語(yǔ)法以及更現(xiàn)代的 DX10+ 樣式語(yǔ)法。
不同之處主要在于紋理采樣函數(shù)的工作方式:
舊版語(yǔ)法使用?
sampler2D
、tex2D()
?和類(lèi)似函數(shù)。此語(yǔ)法適用于所有平臺(tái)。DX10+ 語(yǔ)法使用?
Texture2D
、SamplerState
?和?.Sample()
?函數(shù)。由于紋理和采樣器在 OpenGL 中_不是_不同對(duì)象,因此該語(yǔ)法的某些形式在 OpenGL 平臺(tái)上無(wú)效。
在 Unity 中,可使用預(yù)定義宏來(lái)聲明和采樣紋理,從而避免發(fā)生 HLSL 語(yǔ)法平臺(tái)支持問(wèn)題。Unity 將根據(jù)編譯著色器的目標(biāo)平臺(tái),將這些宏擴(kuò)展為最合適的語(yǔ)法。
著色器編譯器
不同平臺(tái)使用不同的著色器編譯器來(lái)編譯著色器程序,如下所述:
Windows 和 Microsoft 平臺(tái)(DX11、DX12 和 Xbox One)全部使用 Microsoft 的 HLSL 編譯器(最新版本為 FXC / D3DCompiler_47)。
OpenGL (Core & ES)、Metal 和 Vulkan 使用 Microsoft 的 HLSL,然后使用?HLSLcc?按字節(jié)代碼轉(zhuǎn)換為 GLSL、Metal 或 SPIR-V。
其他游戲主機(jī)平臺(tái)使用其各自的編譯器(例如,PS4 使用 PSSL)。
表面著色器使用 HLSL 和?MojoShader?來(lái)完成代碼生成分析步驟。
可以使用預(yù)定義著色器宏來(lái)確定 Unity 在使用哪個(gè)編譯器(例如,使用僅一種編譯器支持的 HLSL 語(yǔ)法)或解決編譯器錯(cuò)誤。