Unity-Unity 中使用的着色语言
在 Unity 中,可使用 HLSL 编程语言来编写着色器程序。
Unity 最初使用 Cg 语言,因此会使用 Unity 某些着色器关键字的名称 (CGPROGRAM
) 和文件扩展名 (.cginc
)。Unity 已不再使用 Cg,但仍支持这些关键字和文件扩展名。请注意,所有着色器程序代码都必须是有效的 HLSL,即使代码使用与 Cg 相关的关键字和文件扩展名也如此。
使用 HLSLPROGRAM
与使用 CGPROGRAM
之间的唯一区别在于 Unity 在编译着色器程序时自动包含的文件。这是为了向后兼容。有关更多信息,请参阅内置着色器 include 文件。
HLSL 语法
HLSL 语言本身有两种语法:“旧版”的 DX9 样式语法以及更现代的 DX10+ 样式语法。
不同之处主要在于纹理采样函数的工作方式:
旧版语法使用
sampler2D
、tex2D()
和类似函数。此语法适用于所有平台。DX10+ 语法使用
Texture2D
、SamplerState
和.Sample()
函数。由于纹理和采样器在 OpenGL 中_不是_不同对象,因此该语法的某些形式在 OpenGL 平台上无效。
在 Unity 中,可使用预定义宏来声明和采样纹理,从而避免发生 HLSL 语法平台支持问题。Unity 将根据编译着色器的目标平台,将这些宏扩展为最合适的语法。
着色器编译器
不同平台使用不同的着色器编译器来编译着色器程序,如下所述:
Windows 和 Microsoft 平台(DX11、DX12 和 Xbox One)全部使用 Microsoft 的 HLSL 编译器(最新版本为 FXC / D3DCompiler_47)。
OpenGL (Core & ES)、Metal 和 Vulkan 使用 Microsoft 的 HLSL,然后使用 HLSLcc 按字节代码转换为 GLSL、Metal 或 SPIR-V。
其他游戏主机平台使用其各自的编译器(例如,PS4 使用 PSSL)。
表面着色器使用 HLSL 和 MojoShader 来完成代码生成分析步骤。
可以使用预定义着色器宏来确定 Unity 在使用哪个编译器(例如,使用仅一种编译器支持的 HLSL 语法)或解决编译器错误。