本系列文章系学习 唐福幸《Unity ShaderLab 新手宝典》的笔记,包含个人理解,如有错误欢迎批评指出
ShaderLab语法基础
3.1 Shader脚本的组织机构
Shader "Name"
{
Properties
{
//开放到材质面板的属性
}
SubShader
{
//顶点、片段着色器
//表面着色器
//固定函数着色器
//适配顶级显卡
}
SubShader
{
//更加精简的版本
//为了在旧的图形设备上运行
//适配中级显卡
}
SubShader
{
//适配入门级显卡
}
...
Fallback "Name" //以上都执行失败,就会跳转到Fallback指定的函数
}
3.2 Shader名称
- 建立一个新的Shader,修改下路径/名称
- 建立一个新的材质,选择要使用的Shader,就可以在材质面板Shader下拉列表里的相应路径的Shader
3.3 Properties
在编写Shader时候会遇到一些需要可调整的变量,贴图等数据。类似函数中的参数。这些变量被设置成开放属性,后续可以在材质面板里面调整,以提供给子着色器使用。
有三大类,格式如下
_Name(“Display Name”, type) = defaultValue[{options}]
_Name:属性的名字,方便获取在开头加下划线,在代码中使用这个名称获取属性
Display Name:在材质面板中显示的名字
type:属性的类型
default:属性的默认值
3.3.1 数值类属性
- unity提供了两种数值类型:整数型和浮点型,最终都会转换成浮点型数据
- Range是一个介于最大和最小值的浮点型数据,在面板作为滑动条显示
name(“display name”,Float)= number
name(“display name”,Range(min, max))= number
例:
_MyNum(“Float Property”,Float)= 1
_MyRan(“Range Property”,Range(0, 1))= 0.5
3.3.2 颜色和向量类属性
name(“display name”,Color)=(number,number,number,number)
name(“display name”,Vector)=(number1,number2,number3,number4)
例:
_MyCol(“Color Property”,Color)= (1,0,0,1)
_MyVec(“Vector Property”,Vector)= (0,1,0,0)
3.3.3 纹理贴图类属性
name(“display Property”,2D)= “default”{}
name(“display Property”,Cube)= “default”{}
name(“display Property”,3D)= “default”{}
例:
_MyTex(“Texture Property”,2D)= “white”{}
_MyCube(“Cube Property”,Cube)= “”{}
_My3D(“3D Property”,3D)= “”{}
3.4 SubShader
每个Shader都会至少包含一个SubShader,当Unity要渲染一个材质的时候就会调用其中的一个SubShader(会从上往下找到第一个能在当前显卡运行的Shader)
3.4.1 SubShader的标签
类似一些开关, 作用于后面的渲染效果
Tags{“TagName1” = “Value1” “TagName2” = “Value2”}
如上所示: 标签通过键值对进行声明, 没有数量限制
常用标签:
Queue 队列: 确定shader的渲染顺序
RenderType 渲染类型: 划分不同类型, 用于后期进行shader替换或产生摄像机的深度纹理
DisableBatchIng 禁用批处理: 使用批处理时, 几何体会被变换到世界空间, 模型空间会被丢弃(可能会导致部分shader失效), 所以有的时候需要禁用批处理
ForceNoShadowCasting 禁用阴影投射: 有的特效不需要对其它物体产生投影
IgnoreProjector 忽略投射机: 如果不希望物体受到投影机的投射(一般半透明的shader会开启)
3.4.2 Pass的渲染状态
可以在Pass外设置:这是针对全局的
也可以在Pass内设置:是针对局部的
Cull Back|From|Off:设置多边形的剔除方式,背面(默认)、正面、不剔除
ZWrite On|Off:是否写入深度缓存(默认On)
…
3.5 Fallback
Fallback “Name”
当前面所有的SubShader都不难在当前显卡上执行,就会执行Fallback定义的Shader
最常用的是执行内置的Diffuse
如果觉得某个Shader肯定可以在当前显卡执行,可以关闭Fallback
Fallback Off