在总览章节我们提到,ShaderLab
总体语法骨架主要由3个层级模块嵌套组成:Shader
、SubShader
、Pass
。每个层级模块都有对应的全局变量域,在全局变量域中可以声明4种全局变量:渲染状态(RenderState),结构体,函数,以及单变量。
变量类型 | 描述 |
---|---|
渲染状态 | 对应引擎 RenderState API,可以直接在 ShaderLab 中进行设置 |
结构体 | 作用等同于 GLSL 中的结构体,同时也用于 Varying 和 Attribute 变量声明定义,详见文档 |
函数 | 作用等同于 GLSL 中的全局函数 |
单变量 | 用于定义 Shader 中的 Uniform 变量 |
与其他编程语言类似,ShaderLab
中的全局变量也有作用域和同名覆盖原则。简单来说,全局变量的作用和可见范围仅限于其声明的模块内部,即 Shader
、SubShader
和 Pass
模块。而同名覆盖原则指的是如果在 Pass
模块内存在与其上级 SubShader
模块内同名的全局变量,则 Pass
内的全局变量会覆盖 SubShader
内的同名全局变量。SubShader
和上级 Shader
模块同名变量的覆盖原则同理。
包含混合状态(BlendState
),深度状态(DepthState
),模板状态(StencilState
),光栅化状态(RasterState
),渲染队列(renderQueueType
)。
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;
}
BlendOperation 和 BlendFactor 枚举等同引擎 API。
DepthState state {
Enabled: bool;
WriteEnabled: bool;
CompareFunction: CompareFunction.XXX;
}
CompareFunction 枚举等同引擎 API
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;
}
CompareFunction 和 StencilOperation 枚举等同引擎 API
RasterState state {
CullMode: CullMode.XXX;
DepthBias: float;
SlopeScaledDepthBias: float;
}
CullMode 枚举等同引擎 API
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;