Unity Shader是Unity为开发者提供的高层级的渲染抽象层。
ShaderLab是Unity提供的编写UnityShader的一种说明性语言。
UnityShader基础结构
Shader "ShaderName"
{
Properties{
属性
}
subShader{
//显卡A使用的子着色器
}
subShader{
//显卡B使用的子着色器
}
Fallback "VertexLit"
}
UnityShader的结构
设置名字及材质面板位置:
Shader "Custom/MyShader"{ }
Properties:
设置材质和UnityShader的桥梁:包含一系列属性,在材质面板出现
SubShader:
定义一系列Pass以及可选的状态和标签设置。
Pass:
每个Pass定义了一次完整的渲染流程,但Pass过多,会造成渲染性能的下降。
[RenderSetup]:
状态设置,若在SubShader块中设置,会应用到所有Pass;亦可单独在Pass块中设置,并只作用于该语块。
Cull Back|Front|Off 设置剔除模式:剔除背面/正面/关闭剔除
ZTest Less Greater|LEqual|GEqual|Equal|NotEqual|Always //设置深度测试时使用的函数
ZWrite On|Off //开启/关闭深度写入
Blend SrcFactor DstFactor //开启并设置混合模式
[Tags]:
SubShader和渲染引擎之间的沟通桥梁,是一个键值对,键、值都是字符串类型;用来告诉Unity渲染引擎我希望以及何时渲染这个对象。
结构:Tags {"TagName1" = "Value1" "TagName2" = "Value2"}
Tags{"Queue"="Transparent"} //控制渲染顺序,指定该物体属于哪一个渲染队列。
Tags{"RenderType"="Opaque"} //对着色器进行分类。
Tags{"DisableBatching"="True"} //指明是否对该SubShader使用批处理。
Tags{"ForceNoShadowCasting"="True"} //控制使用该SubShader的物体是否投射阴影。
Tags{"IgnoreProjector"="True"} //设置是否受Projector的影响,通常用于半透明物体。
Tags{"CanUseSpriteAtlas"="False"} //当该SubShader是用于Sprite时,该标签设为False
Tags{"PreviewType"="Plane"} //指明材质面板将如何预览该材质,默认为一个球型。
Pass语义块:
Pass{
[Name] //Name "MyPassName"
[Tags] //怎样渲染该物体
[RenderSetup]
//Other code
}
特殊Pass:
- UsePass:复用其他Unity Shader中的Pass
- GrabPass:抓取屏幕并将结果储存在一张纹理中,用于后续Pass处理。
Fallback:
留条后路,如果上述都不能运行,就使用这个最低级的吧。
此外,Fallback还会影响阴影投射:在渲染阴影纹理时,Unity会在每个Unity Shader中寻找一个阴影投射的Pass
Fallback "name"
//或者
Fallback off
一个涵盖所有的例子:
Shader "Custom/ShaderLabProperties"{
Properties{
//设置属性的名字(通常以下划线开始)、属性显示的名称,类型及默认值
Name("display name",PropertyType)=DefaultValue
Name("display name",PropertyType)=DefaultValue
//更多属性
//Numbers and Sliders
_Int("Int",Int)=2
_Float("Float",Float)=1.5
_Range("Range",Range(0.0,5.0))=3.0
//Colors and Vector
_Color("Color",Color)=(1,1,1,1)
_Vector("Vector",Vector)=(2,3,6,1)
//Textures
_2D("2D",2D)=""{}
_Cube("Cube",Cube)="white"{}
_3D("3D",3D)="black"{}
}
SubShader{
//可选的
[Tags]
//可选的
[RenderSetup]
pass{
}
//Other Passes
}
}