Unity3D:如何Unity 加载并使用着色器
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
如何Unity 加载并使用着色器
Unity 通过以下方式从构建的应用程序加载已编译的着色器:
- 当 Unity 加载现场
或运行时资源,它加载所有已编译的着色
将场景或资源的变体放入 CPU 内存中。 - 默认情况下,Unity 将所有着色器变体解压缩到 CPU 内存的另一个区域中。您可以控制在不同平台上使用的内存着色器量。
- Unity 第一次需要使用着色器变体渲染几何体时,Unity 会将着色器变体及其数据传递给图形 API 和图形驱动程序。
- 图形驱动程序创建特定于 GPU 的着色器变体版本,并将其上传到 GPU。
此方法可确保 Unity 和图形驱动程序避免在 Unity 需要它们之前在 GPU 上处理和存储所有着色器变体。但是,当图形驱动程序首次创建特定于 GPU 的着色器变体时,可能会出现明显的停滞。
Unity 会缓存每个特定于 GPU 的着色器变体,以避免在 Unity 再次需要着色器变体时再次停滞。
当不再有任何对象引用着色器变体时,Unity 会从 CPU 和 GPU 内存中完全删除着色器变体。
Unity 加载哪些着色器
Unity 仅加载与平台的图形 API、硬件和图形层兼容的已编译着色器。
如果 Unity 找不到所需的着色器变体,因为您或 Unity 从构建的应用程序中去除了着色器变体,Unity 会尝试选择类似的着色器变体。如果 Unity 找不到类似的着色器变体,它将使用洋红色错误着色器。
您可以启用严格的着色器变体匹配,以阻止 Unity 尝试选择类似的着色器变体。
Unity 如何选择子着色器
如果着色器变体包含多个子着色器,Unity 会尝试选择并使用与以下所有内容兼容的单个子着色器:
- 平台的硬件。
- 当前着色器实验室细节级别 (LOD)。
- 活跃的渲染管线
.
Unity 按以下顺序在以下元素中搜索第一个兼容的子着色器:
- 子着色器按它们在着色器中显示的顺序排列。
- 任何回退中的子着色器着色器对象
,按照它们在着色器对象中出现的顺序排列。
如果 Unity 找不到兼容的子着色器,它将使用洋红色错误着色器。
您可以使用以下方法设置哪些子着色器与哪些硬件兼容着色器实验室
标签。请参阅着色器实验室:将标记分配给子着色器。
预热着色器变体
为了避免在性能密集型时间出现可见停顿,Unity 可以要求图形驱动程序在首次需要着色器变体之前创建着色器变体的 GPU 表示形式。这称为预热。
您可以通过以下方式进行预热:
- 使用 Experimental.Rendering.ShaderWarmup API 预热着色器对象或着色器变体集合。
- 通过使用 ShaderVariantCollection.WarmUp API 预热着色器变体集合。
- 使用 Shader.WarmupAllShaders API 预热当前内存中所有着色器对象的所有变体。
您还可以将着色器变体集合添加到“图形设置”窗口的“预加载着色器”部分。Unity 使用 API 在构建的应用程序启动时加载和预热着色器变体集合。ShaderVariantCollection.WarmUp
在 DirectX 12、Metal 或 Vulkan 上预热
如果为 DirectX 12、Metal 或 Vulkan 构建,则图形驱动程序只有在知道确切的顶点数据布局和呈现状态的情况下才能创建着色器变体的准确 GPU 表示形式。如果预热的 GPU 表示不准确,Unity 在需要创建准确的表示时仍可能停滞不前。
要创建准确的变体并避免停滞,您应该通过在屏幕外渲染材质来预热。
您还可以:
- 使用 预热着色器对象或着色器变体集合,但前提是可以提供顶点数据布局并准确设置渲染状态。
Experimental.Rendering.ShaderWarmup
- 使用 or ,这可能会创建不准确的预热 GPU 表示形式,因为您无法提供顶点数据布局或呈现状态。
ShaderVariantCollection.WarmupShader.WarmupAllShaders
控制内存着色器使用量
在构建的应用程序中,Unity 存储多个压缩着色器变体数据的“块”。每个区块包含多个着色器变体。当 Unity 在运行时加载场景时,它会将所有场景的区块加载到 CPU 内存中并解压缩它们。
要减少内存有限的平台上的内存使用量,您可以限制区块的大小以及 Unity 在内存中保留的解压缩区块数。
为此,在播放器设置
,选择其他设置>着色器变体加载并调整以下设置:
- 使用默认区块大小 (MB) 设置 Unity 在构建的应用程序中存储的压缩区块的最大大小。
- 使用默认区块计数来限制 Unity 在内存中保留的解压缩区块数。默认值为 ,表示没有限制。
0
有关详细信息,请参阅 PlayerSettings.SetDefaultShaderChunkCount。
您可以使用“替代”单独覆盖每个平台的值。请参阅 PlayerSettings.SetShaderChunkCountForPlatform 了解更多信息。
您还可以使用 Shader.maximumChunksOverride 在运行时覆盖默认块计数。
用于着色器加载的探查器标记
您可以使用以下内容探查器标记
以查看着色器加载分析器
:
Shader.ParseThreaded
以及用于从序列化数据加载着色器对象的 Unity 。Shader.ParseMainThread
Shader.CreateGPUProgram
用于 Unity 创建特定于 GPU 的着色器变体版本。
由3D建模学习工作室整理翻译,转载请注明出处!