Version: 2023.2
着色器简介
着色器资源

Shader 类

在 Unity 中,当您使用的着色器属于图形管线 的一部分,通常用到 Shader 类的实例。我们将一个 Shader 类的实例称为 Shader 对象

Shader 对象是 Unity 使用着色器程序的特定方式;它是着色器程序和其他信息的封装器。它允许您在同一个文件中定义多个着色器程序,并告诉 Unity 如何使用它们。

渲染管线兼容性

功能名称 内置渲染管线 通用渲染管线 (URP) 高清渲染管线 (HDRP) 自定义 SRP
Shader 对象

Shader 对象基础

Shader 对象包含着色器程序、更改 GPU 上设置的指令(统称为渲染状态)以及告诉 Unity 如何使用它们的信息。

您将 Shader 对象与材质共同使用来确定场景的外观。

资源

您可以通过两种方式创建 Shader 对象。分别具有各自类型的资源:

无论您以何种方式创建 Shader 对象,Unity 在内部都以相同的方式表示结果。

在 Shader 对象内部

Shader 对象具有嵌套结构。它将信息按照名为子着色器通道的结构进行组织。它将着色器程序组织成着色器变体

Shader 对象

Shader 对象包含:

  • Information about itself, such as its name *一个可选的回退 Shader 对象,如果 Unity 不能使用这个对象,则会使用回退对象
  • 一个或多个子着色器。

您还可以定义附加信息,例如共享着色器代码,或是否使用自定义编辑器。有关定义 Shader 对象的信息,请参阅 ShaderLab:定义一个 Shader 对象

子着色器

子着色器用于将 Shader 对象分成多个部分,分别兼容不同的硬件、渲染管线和运行时设置。

一个子着色器包含:

  • 有关此子着色器与哪些硬件、渲染管线和运行时设置兼容的信息
  • 子着色器标签,这是提供有关子着色器的信息的键值对
  • 一个或多个通道

您还可以定义其他信息,例如对其所有通道通用的渲染状态。有关可在子着色器中定义的所有信息,请参阅 ShaderLab:定义一个子着色器

通道

通道包含:

  • 通道标签,这是提供有关通道的信息的键值对
  • 在运行着色器程序之前更新渲染状态的说明
  • 着色器程序,组织成一个或多个着色器变体

您还可以定义其他信息,例如名称。有关可在通道中定义的所有信息,请参阅 ShaderLab:定义一个通道

着色器变体

通道包含的着色器程序被组织成着色器变体。着色器变体共享通用代码,通过启用或禁用给定关键字,使其具有不同功能。

通道中的着色器变体的数量取决于您在着色器代码中定义的关键字数量以及目标平台。每个通道包含至少一个变体。

For more information, see Shader variants.

着色器简介
着色器资源