Unity3D:着色器编译

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

着色器编译

概述

每次构建项目时,Unity 编辑器都会编译构建所需的所有着色器:针对每个所需的图形 API 编译每个所需的着色器变体。

当您在 Unity 编辑器中工作时,编辑器不会提前编译所有内容。这是因为为每个图形 API 编译每个变体可能需要很长时间。

相反,Unity 编辑器会这样做:

  • 当导入一个着色器资源时,会执行一些最小的处理(例如表面着色器生成)。
  • 当需要显示着色器变体时,它会检查 Library/ShaderCache 文件夹。
  • 如果找到使用相同源代码的先前编译的着色器变体,则会使用该着色器变体。
  • 如果没有找到匹配项,则编译所需的着色器变体并将结果保存到缓存中。
  • 注意:如果您启用异步着色器编译,它在后台执行此操作并同时显示占位着色器。

着色器编译使用名为 UnityShaderCompiler 的进程。可启动多个 UnityShaderCompiler 编译器进程(通常在机器中每个 CPU 核心对应一个),这样在播放器构建时就可以并行完成着色器编译。当编辑器不编译着色器时,编译器进程不执行任何操作,也不消耗计算机资源。

如果有许多经常更改的着色器,着色器缓存文件夹可能会变得非常大。删除此文件夹是安全的;只会导致 Unity 重新编译着色器变体。

在播放器构建时,所有“尚未编译”的着色器变体都将被编译,因此即使编辑器不会使用这些着色器变体,它们也会存在于游戏数据中。

不同的着色器编译器

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

  • 使用 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 来完成代码生成分析步骤。

使用 pragma 指令可以配置各种着色器编译器设置。

缓存着色器预处理器

着色器编译涉及几个步骤。首先,需要进行预处理。在此步骤中,一个名为预处理器的程序为编译器准备着色器源代码。

在以前版本的 Unity 中,编辑器使用着色器编译器为当前平台提供的预处理器。现在,Unity 使用自己的预处理器,也称为缓存着色器预处理器。

缓存着色器预处理器经过优化,可加快着色器导入和编译速度。它通过缓存中间预处理数据来工作,因此编辑器只需要在包含文件的内容更改时解析包含文件,这使得编译同一着色器的多个变体更加高效。

有关缓存着色器预处理器和以前行为之间差异的详细信息,请参阅 Unity 论坛:新着色器预处理器 (New shader preprocessor)。

构建时剥离

在构建游戏时,Unity 可以检测到游戏未使用某些内部着色器变体,并从构建数据中排除(“剥离”)它们。有关详细信息,请参阅着色器变体。

3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D:着色器资源 (mvrlink.com)

下一篇:Unity3D:异步着色器编译 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号