全局变量声明

在总览章节我们提到,ShaderLab 总体语法骨架主要由3个层级模块嵌套组成:ShaderSubShaderPass。每个层级模块都有对应的全局变量域,在全局变量域中可以声明4种全局变量:渲染状态(RenderState),结构体,函数,以及单变量。

变量类型描述
渲染状态对应引擎 RenderState API,可以直接在 ShaderLab 中进行设置
结构体作用等同于 GLSL 中的结构体,同时也用于 Varying 和 Attribute 变量声明定义,详见文档
函数作用等同于 GLSL 中的全局函数
单变量用于定义 Shader 中的 Uniform 变量

全局变量作用域

与其他编程语言类似,ShaderLab 中的全局变量也有作用域和同名覆盖原则。简单来说,全局变量的作用和可见范围仅限于其声明的模块内部,即 ShaderSubShaderPass 模块。而同名覆盖原则指的是如果在 Pass 模块内存在与其上级 SubShader 模块内同名的全局变量,则 Pass 内的全局变量会覆盖 SubShader 内的同名全局变量。SubShader 和上级 Shader 模块同名变量的覆盖原则同理。

渲染状态

包含混合状态(BlendState),深度状态(DepthState),模板状态(StencilState),光栅化状态(RasterState),渲染队列(renderQueueType)。

BlendState

BlendState state {
  Enabled: bool;
  ColorBlendOperation: BlendOperation.XXX;
  AlphaBlendOperation: BlendOperation.XXX;
  SourceColorBlendFactor: BlendFactor.XXX;
  SourceAlphaBlendFactor: BlendFactor.XXX;
  DestinationColorBlendFactor: BlendFactor.XXX;
  DestinationAlphaBlendFactor: BlendFactor.XXX;
  ColorWriteMask: float // 0xffffffff
  BlendColor: vec4;
  AlphaToCoverage: bool;
}

BlendOperationBlendFactor 枚举等同引擎 API。

DepthState

DepthState state {
  Enabled: bool;
  WriteEnabled: bool;
  CompareFunction: CompareFunction.XXX;
}

CompareFunction 枚举等同引擎 API

StencilState

StencilState state {
  Enabled: bool;
  ReferenceValue: int;
  Mask: float; // 0xffffffff
  WriteMask: float; // 0xffffffff
  CompareFunctionFront: CompareFunction.XXX;
  CompareFunctionBack: CompareFunction.XXX;
  PassOperationFront: StencilOperation.XXX;
  PassOperationBack: StencilOperation.XXX;
  FailOperationFront: StencilOperation.XXX;
  FailOperationBack: StencilOperation.XXX;
  ZFailOperationFront: StencilOperation.XXX;
  ZFailOperationBack: StencilOperation.XXX;
}

CompareFunctionStencilOperation 枚举等同引擎 API

RasterState

RasterState state {
  CullMode: CullMode.XXX;
  DepthBias: float;
  SlopeScaledDepthBias: float;
}

CullMode 枚举等同引擎 API

renderQueueType

RenderQueueType = Transparent;
RenderQueueType = Opaque;
RenderQueueType = AlphaTest;

以上各个渲染状态设置参考文档

结构体、函数

等同 GLSL 中的语法,下面代码段显示了分别声明在 Shader、SubShader 和 Pass 域内的函数和结构体:

Shader "PlanarShadow" {
 
  ...
  // 作用域为整个 Shader 模块
  mat4 getJointMatrix(sampler2D smp, float index) {
    float base = index / renderer_JointCount;
    ...
    return mat4(m0, m1, m2, m3);
  }
  ...
 
  SubShader "Default" {
    ...
    // 作用域为 "Default" SubShader 模块
    vec3 ShadowProjectPos(vec4 vertPos) {
      vec3 shadowPos;
      ...
      return shadowPos;
    }
    ...
 
    Pass "0" {
      ...
      // a2v 结构体只对 Pass "0" 可见
      struct a2v {
        vec4 POSITION;
        vec4 JOINTS_0; 
        vec4 WEIGHTS_0;
      };
      ...
    }
  }
  ...
}
 

单变量

等同 GLSL 中的语法,ShaderLab 中所有 Uniform 变量使用全局单变量语法来声明。

[lowp/mediump/highp] mat4 uMVPMatrix;

这篇文档对您有帮助吗?