ShaderLab 是 Unity 引擎中用于编写着色器(Shader)的配置语言和结构化框架。它不是一种真正的编程语言(如 HLSL 或 Cg),而是一个描述性语言,用来组织和定义着色器的结构、属性、子着色器、渲染状态等。在 Unity 中,使用 ShaderLab 来描述整个着色器的行为,并嵌入实际的 GPU 着色器代码(如 HLSL、CG 等)来实现具体的视觉效果。
示例
Shader "ChaimLearn/Framework"
{
Properties {
// 定义材质的可调节属性
_MainTex ("Texture", 2D) = "white" {}
_Color ("Color", Color) = (1,1,1,1)
}
SubShader {
Tags { "Queue" = "Geometry" }
Pass {
Tags { "LightMode" = "ForwardBase" }
// 设置渲染状态
Cull Off
ZWrite On
Blend SrcAlpha OneMinusSrcAlpha
HLSLPROGRAM // 着色器代码开始
#pragma vertex vert // 指定顶点着色器函数名
#pragma fragment frag // 指定片段着色器函数名
sampler2D _MainTex; // 属性变量
float4 _Color;
float4 vert (float4 pos : POSITION) : SV_POSITION {
return UnityObjectToClipPos(pos);
}
fixed4 frag () : SV_Target {
return _Color;
}
ENDHLSL // 着色器代码结束
}
}
Fallback "Diffuse" // 退路
// CustomEditor "MyFancyShaderGUI" // 设置自定义编辑器
}
结构
1. Shader “xx/xx”
用于在Unity中标识Shader
2. Properties
定义材质的可调节属性
[Attribute][...] _Name ("显示名称", Type) = 默认值
-> [属性 Properties](/posts/属性 Properties)
3. SubShader
每个 Shader 可以有多个 SubShader,Unity 会根据当前平台从上往下寻找选择最合适的 SubShader 运行。
3.1 Tags
Tags 是 SubShader 上的元数据标签,用于告诉 Unity 如何处理这个着色器。
RenderPipeline:指定渲染管线,对应渲染管线代码中的Shader.globalRenderPipelineQueue:指定渲染队列->[渲染队列 Render Queue](/posts/渲染队列 Render Queue)DisableBatching:禁用批处理
3.2 Pass
Pass 表示一个完整的渲染通道
3.2.1 Tags
Tags 是 SubShader 或 Pass 上的元数据标签,用于告诉 Unity 如何处理这个着色器或渲染通道。
LightMode:指定渲染路径。Always、ForwardBase、Deferred、MotionVectors等
3.2.1 渲染状态
设置渲染状态,如: [混合模式 Blend Mode](/posts/混合模式 Blend Mode)、[面剔除 和 双面渲染](/posts/面剔除 和 双面渲染)
Cull Off // 剔除模式
ZWrite On // 写入深度缓冲区
Blend SrcAlpha OneMinusSrcAlpha // 颜色混合模式
...
3.2.2 HLSLPROGRAM 和 ENDHLSL
编译指令 和 着色器代码(HLSL/Cg) 需要被包裹在HLSLPROGRAM和ENDHLSL之间。
3.2.3 编译指令
| 用于指定着色器函数 | 描述 |
|---|---|
#pragma vertex name |
指定顶点着色器函数名 |
#pragma fragment name |
指定片段(像素)着色器函数名 |
#pragma geometry name |
指定几何着色器函数(需硬件支持) |
#pragma hull name / #pragma domain name |
控制细分着色器(Tessellation) |
#pragma surface surf surfFunction |
使用 Surface Shader 编写方式(自动处理光照) |
| 其他与C/C++相似: |
#define和#undef:定义或取消定义宏。#if, #elif, #else, #endif:条件编译。#include:包含另一个文件的内容。- [变体 Shader Variants](/posts/变体 Shader Variants)
3.2.4 着色器代码(HLSL/Cg)
着色器代码(HLSL/Cg)
4. Fallback
如果所有 SubShader 都不被当前硬件支持,Unity 将使用 Fallback 指定的内置着色器作为替代方案。
5. CustomEditor
CustomEditor 用于指定一个自定义的 材质编辑器脚本(C#),实现更友好或更复杂的 UI 控件来编辑当前材质。