Unity Shader 之 Properties、SubSha
一、Shader结构语法
Shader "ShaderName"
{
Properties{
//属性
}
SubShader{
Pass{
//一次渲染流程
}
//Other Pass
}
//Other SubShader
Fallback "VertexLit"
}
["ShaderName"]: Shader的名字,一般用“/”控制在材质面板中出现的位置。例如 Custom/MyShader
[Properties]:: 外部数据入口,通过材质"沟通"。
[SubShader]:每个Shader可以包含多个SubShader,至少一个。
[Pass]: 一次完整的渲染流程,允许多个,但是会影响效率。
[Fallback:]当所有SubShader都不支持的时候,会使用这里指定的Shader。
二、Properties语法
Properties{
Name ("display name", PropertyType) = DefaultValue
Name ("display name", PropertyType) = DefaultValue
Name ("display name", PropertyType) = DefaultValue
//... 其他属性
}
Name:变量名
diplay name:显示的名称,出现在材质面板,通常下划线"_"开头
DefaultValue:默认值
PropertyType:指定类型,如下表
属性类型 | 例子 | 类别 |
---|---|---|
Int | _level("Leve",Int) =2 | 数值 |
Float | _alpha("Alpha",Float)= 0.8 | 数值 |
Range | _range("Power",Range(0,0,5.0))=3.0 | 数值 |
Color | _Color("Color",Color)=(1,1,1,1) | 数值 |
Vector | _Vector("VECTOR" ,Vector) = (1,4,7,8) | 数值 |
2D | _2D("Texture2D纹理",2D)=""{} | 纹理 |
3D | _3D("Texture3D纹理",3D)="black"{} | 纹理 |
Cube | _Cube("Cube",Cube)="White"{} | 纹理 |
三、SubShader语法
SubShader{
Tags{"TageName1"="Value1" "TageName2"="Value2"}//[Tage] 标签(可选)
Cull //[RenderSetup] 状态(可选)
Pass{//一次完整的渲染流程
}
//Other Pass
[Tages]:是一个键值对,键和值都是字符串类型,如何、何时渲染这个对象。
[RenderSetup]: 设置显卡的渲染状态,例如混合、深度测试。
[Pass]:渲染流程,允许定义多个,每次渲染都会逐个流程执行。为了避免性能下降,尽量使用最少数目的Pass。
SubShader [Tage] | 说明 | 例子 |
---|---|---|
Queue | 控制渲染顺序,保证所有透明物体在不透明物体后面渲染 | Tags{"Queue" = "Transparent"} |
RenderType | 着色器分类 | Tags{"RenderType"="Opaque"} |
DisableBatching | SubShader指明是否使用批处理 | Tags{"DisableBatching "="True"} |
ForceNoShadowCasting | 是否投射阴影 | Tags{"ForceNoShadowCasting"="True"} |
IgnoreProjector | 是否受到Projector影响,通常用于半透明物体 | Tags{"IgnoreProjector "="True"} |
CanUseSpriteAtlas | 用于Sprite时,请设置为"False" | Tags{"CanUseSpriteAtlas" = "False"} |
PreviewType | 指明材质如何预览,"Plane"或者"SkyBox" | Tags{"PreviewType "="Plane"} |
SubShader[RenderSetup] | 设置指令 | 解释 |
---|---|---|
Cull | Cull Back| Front |Off | 设置剔除模式:剔除背景|正面|关闭剔除 |
ZTest | ZTest Less Greater|LEqual|GEqual|Equal|NotEqual|Always | 设置深度测试时使用的函数 |
ZWrite | ZWrite On|Off | 开启/关闭深度写入 |
Blend | Blend SrcFactor DstFactor | 开启并设置混合模式 |
四、Pass语法
Pass{
Name "MyPassName"//[Name] 可选
LightMode//[Tags] 可选
Cull//[RenderSetup] 可选
//other code
}
[Name]: Pass的名称,被其他Shader调用时候会用到。
[Tags]:渲染物体的方式,下面有表格详细说明。
[RenderSetup]:渲染状态,和SubShader RenderSetup 完全一样。
Pass[Tags] | 说明 | 例子 |
---|---|---|
LightMode | 定义该Pass在Unity的渲染流水线中的角色 | Tags{"LightMode"="ForwardBase"} |
RequireOptions | 用于指定当满足条件才执行Pass | Tags{”RequireOptions“=”SoftVegetation“} |
- UsePass: 复用其他Shader中的Pass。例如:UsePass "MyShader/MYPASSNAME"
- GrabPass:抓取屏幕并将结果存储在一张纹理中。
五、Fallback
指定最后处理的Shader(以上的SubShader都不能运行的时候), Fallback还会印象阴影投射。
语法:
Fallback Off //没有阴影
Fallback "ShaderName"
Fallback "VertexLit"
Fallback "Diffuse"
最后推介辅助插件
打开 Visual Studio “工具”→“扩展和更新”→“联机 Visual Studio Marketplace”搜索
Shader Unity Support
Visual Studio 2017 Tools for Unity
鄙人才疏学浅,有出入的地方非常感谢能帮忙指正。:)