Version: 2019.4
GLSL 着色器程序
着色器编译目标级别

Unity 中使用的着色语言

在 Unity 中,可使用 HLSL 编程语言来编写着色器程序

Unity 最初使用 Cg 语言,因此会使用 Unity 某些着色器关键字的名称 (CGPROGRAM) 和文件扩展名 (.cginc)。Unity 已不再使用 Cg,但仍支持这些关键字和文件扩展名。请注意,所有着色器程序代码都必须是有效的 HLSL,即使代码使用与 Cg 相关的关键字和文件扩展名也如此。

使用 HLSLPROGRAM 与使用 CGPROGRAM 之间的唯一区别在于 Unity 在编译着色器程序时自动包含的文件。这是为了向后兼容。有关更多信息,请参阅内置着色器 include 文件

HLSL 语法

HLSL 语言本身有两种语法:“旧版”的 DX9 样式语法以及更现代的 DX10+ 样式语法。

不同之处主要在于纹理采样函数的工作方式:

  • 旧版语法使用 sampler2Dtex2D() 和类似函数。此语法适用于所有平台。
  • DX10+ 语法使用 Texture2DSamplerState.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 语法)或解决编译器错误。

另请参阅

GLSL 着色器程序
着色器编译目标级别