多 Pass Shader 编写

有时我们想要绘制一个复杂特效通常需要在一次渲染主循环中渲染多次,因此我们可以将这些关联的 Pass 放到同一个 SubShader 下统一管理起来。通常我们称含有多个 Pass 的 Shader 为 多-Pass-Shader

如下所示,在 SubShader 中声明渲染所需的多个 Pass,引擎会根据声明顺序依次渲染 Pass。

SubShader "SubShaderName" {
  ...
  // 全局变量区:变量声明,结构体声明,渲染状态声明
  ...
 
  Pass "Pass0" { ... }
  Pass "Pass1" { ... }
  Pass "Pass2" { ... }
 
  ...
}

UsePass

开发者可以通过 UsePass 指令复用 Shader Pass,: UsePass "{pass 路径}"。 Pass 路径格式为 {ShaderName/SubShaderName/PassName}, 比如开发者声明了以下 Shader Pass:

Shader "water" {
  ...
  SubShader "Default" {
    ...
    Pass "0" {
      ...
    }
    ...
  }
  ...
}

开发者在其它自定义 Shader 中可以通过 UsePass "water/Default/0" 进行复用。

此外 UsePass 指令同样支持引擎内置 Pass 的复用,目前可复用的引擎内置 Pass 如下:

内置 ShaderPass 路径
PBRpbr/Default/Forward
Unlitunlit/Default/Forward
Skyboxskybox/Default/Forward
Particle-shaderparticle-shader/Default/Forward
SpriteMaskSpriteMask/Default/Forward
SpriteSprite/Default/Forward

SubShader 除了用于组织多 Pass,还可以设置 Tag,作用相当于引擎 setTag API。比如设置 ReplaceTag:

SubShader "SubShaderName" {
  ...
  Tags {ReplaceTag = "opaque"}
 
  Pass "PassName" {
    ...
  }
}

这篇文档对您有帮助吗?

On this page