Version: Unity 6.0 (6000.0)
语言 : 中文
以代码编写着色器的简介
在 ShaderLab 和 HLSL 中编写自定义着色器

Shader 对象基础

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

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

渲染管线兼容性

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

Shader 对象

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

将 Shader 对象与材质配合使用可以确定场景的外观。

资源

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

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

在 Shader 对象内部

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

Shader 对象

Shader 对象包含:

  • 关于此对象的信息,例如其名称
  • 一个可选的回退 Shader 对象,如果 Unity 不能使用这个对象,则会使用回退对象
  • 个或多个子着色器。

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

子着色器

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

一个子着色器包含:

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

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

通道

通道包含:

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

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

着色器变体

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

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

有关更多信息,请参阅着色器变体

以代码编写着色器的简介
在 ShaderLab 和 HLSL 中编写自定义着色器