基本结构:
Shader "ShaderName"{
Properties{
//属性
}
SubShader{
//显卡A使用的子着色器
}
SubShader{
//显卡B使用的子着色器
}
Fallback "VertexLit"
}
Properties语义块的定义:
Properties{
Name("displayName",PropertyType)=DefaultValue
Name("displayName",PropertyType)=DefaultValue
//更多属性
}
属性类型 | 默认值的定义语法 | 例子 |
Int | number | _Int("Int",Int)=2 |
Float | number | _Float("Float",Float)=1.5 |
Range(min,max) | number | _Range("Range",Range(0.0,5.0))=3.0 |
Color | (number,number,number,number) | _Color("Color",Color)=(1,1,1,1) |
Vector | (number,number,number,number) | _Vector("Vector",Vector)=(2,3,6,1) |
2D | "defaulttexture"{} | _2D("2D",2D)=""{} |
Cube | "defaulttexture"{} | _Cube("Cube",Cube)="white"{} |
3D | "defaulttexture"{} | _3D("3D",3D)="black"{} |
SubShader语义块的定义:
SubShader{
[Tags] //可选的
[RenderSetup] //可选的
Pass{
}
//Other Passes
}
标签([Tags])的结构:
Tags{"TagName1"="Value1" "TagName2"="Value2"}
SubShder支持的标签类型:
标签类型 | 说明 | 例子 |
Qucue | 控制渲染顺序,指定该物体属于哪一个渲染队列,通过这种方式可以保证所有的透明物体可以在所有不透明物体后面被渲染,也可以自定义使用的渲染队列来控制物体的渲染顺序 | Tags{"Queue"="Transparent"} |
RenderType | 对着色器进行分类,例如这是一个不透明的着色器,或是一个透明的着色器等。这可以被用于着色器替换(Shader Replacement)功能 | Tags{"RenderType"="Opaque"} |
DisableBatching | 一些SubShader在使用Unity的批处理功能时会出现问题,例如使用了模型空间下的坐标进行顶点动画。这时可以通过该标签来直接指明是否对该SubShader使用批处理 | Tags{"DisableBatching"="True"} |
ForceNoShadowCasting | 控制使用该SubShader的物体是否会投射阴影 | Tags{"ForceNoShadowCasting"="True"} |
IgnoreProjector | 如果该标签值为"True",那么使用该SubShader的物体将不会受Projector的影响。通常用于半透明的物体 | Tags{"IgnoreProjector"="True"} |
CanUseSpriteAtlas | 当该SubShader是用于精灵(Sprites)时,将该标签设为“False” | Tags{"CanUseSpriteAtlas"="False"} |
PreviewType | 指明材质面板将如何预览该材质。默认情况下,材质将显示为一个球形,我们可以通过把该标签的值设为“Plane”“SkyBox”来改变预览类型 | Tags{"PreviewType"="Plane"} |
常见的状态设置([RenderSetup])选项:
状态名称 | 设置指令 | 解释 |
Cull |
| 设置剔除模式:剔除背面/正面/关闭剔除 |
ZTest |
| 设置深度测试时使用的函数 |
ZWrite |
| 开启/关闭深度写入 |
Blend |
| 开启并设置混合模式 |
Pass语义块的定义:
Pass{
//如:Name "MyPassName"
//使用其它Shader中的Pass时:UsePass "MyShader/MYPASSNAME"
//注意:Unity内部会把所有Pass名称转换为大写,使用UsePass命令时要使用大写的名称
[Name]
//注意:与SubShader使用的标签类型不一样
[Tags]
[RenderSetup]
//Other code
}
Pass支持的标签类型:
标签类型 | 说明 | 例子 |
LightMode | 定义该Pass在Unity的渲染流水线中的角色 | Tags{"LightMode"="ForwardBase"} |
RequireOptions | 用于指定当满足某些条件时才渲染该Pass,它的值是一个由空格分隔的字符串。目前,Unity5.0支持的选项有:SoftVegetation | Tags{"RequireOptions"="RequireOptions"} |
GrabPass:负责抓取屏幕并将结果存储在一张纹理中。
Fallback:紧跟在各个SubShader语义块后面,如果上面所有的SubShader在此显卡都不能运行,则使用指定的Shader或关闭Fallback功能。
Fallback "name"
//或者
Fallback Off