Version: 2020.1
高级 ShaderLab 主题
Asynchronous shader compilation in the Unity Editor

着色器编译

不同平台使用不同的着色器编译器来编译着色器程序,如下所述:

  • 使用 DirectX 的平台会使用 Microsoft 的 FXC HLSL 编译器。
  • 使用 OpenGL (Core & ES) 的平台会使用 Microsoft 的 FXC HLSL 编译器,然后使用 HLSLcc 将字节代码转换为 GLSL。
  • 使用 Metal 的平台会使用 Microsoft 的 FXC HLSL 编译器,然后使用 HLSLcc 将字节代码转换为 Metal。
  • 使用 Vulkan 的平台会使用 Microsoft 的 FXC HLSL 编译器,然后使用 HLSLcc 将字节代码转换为 SPIR-V。
  • 其他平台(如游戏主机平台)使用其各自的编译器。
  • 表面着色器使用 HLSL 和 MojoShader 来完成代码生成分析步骤。

可以使用预定义的着色器宏来确定 Unity 正在使用哪个编译器。如果使用只有一个编译器才支持的 HLSL 语法,或者要解决编译器错误,您可能需要使用它。

You can configure various shader compiler settings using [SL-Programs](compilation directives).

缓存着色器预处理器(实验性功能)

着色器编译涉及几个步骤。首先,需要对着色器源代码进行预处理。默认情况下,Unity 使用平台编译器的预处理器来执行这一步;但是,您可以选择覆盖它,而使用 Unity 的缓存着色器预处理器来执行预处理。缓存着色器预处理器比平台编译器使用的默认预处理器最多快 25%。

缓存着色器预处理器缓存中间预处理数据,可以加速着色器导入和编译。编辑器重用这些缓存数据,只需要在内容更改时解析 include 文件。这使得编译同一着色器的多个变体更加高效。当项目中的着色器使用大量常见 include 文件时,启用缓存着色器预处理器具有最明显的效果。

请注意,缓存着色器预处理器是实验性的功能;仍处于积极开发阶段。您可以在 Unity 论坛上提供与此实验性功能相关的反馈。

您可以使用 Editor settings 窗口的 Shader Compilation 部分中的 Caching Shader Preprocessor (Experimental) 复选框来启用或者禁用缓存着色器预处理器。也可以在 C# 脚本中使用 EditorSettings.cachingShaderPreprocessor API 启用或禁用此功能。

高级 ShaderLab 主题
Asynchronous shader compilation in the Unity Editor