Shader"name"{//name shader名字//定义的一些属性,定义在这里的会在属性查看器里面显示;
//子着色器列表,一个Shader必须至少有一个子着色器;
Subshaders:{...}
//如果子着色器显卡不支持,就会降级,即Fallback操作;
[Fallback]
}
(一)Properties定义
- name(“display name”,type)=值; name:指的是属性的名字,Unity中用下划线开始_Name;
display name:是在属性检查器的名字; type:这个属性的类型; 值:指这个属性的默认值; - 类型:Float,Int,Color(num,num,num,num)(0~1)Vector(4维向量),Range(start,end)
2D:2D纹理属性; Rect:矩形纹理属性; Cube:立方体纹理属性; 3D:3D纹理属性;
name(“displayname”,2D)=“name”{options} - Options:纹理属性选项
TexGen:纹理生成模式,纹理自动生成纹理坐标的模式;顶点shader将会忽略这个选项;objectLinear,EyeLinear,SphereMap,CubeReflect,CubeNormal
LightmapMod:光照贴图模式如果设置这个选项,纹理会被渲染器的光线贴图所影响。
_Range("range value",Range(0,1))=0.3;//定义一个范围
_Color("color",Color)=(1,1,1,1);//定义一个颜色
_FloatValue("float value",Float)=1;//定义一个浮点
_MainTex("Albedo",Cube)="skybox"{TexGen CubeReflect}//定义一个立方贴图纹理属性;
(二)SubShader
- SubShader{[Tags],[CommonState],Pass{}}
子着色器由标签(Tags),通用状态,通道列表组成,它定义了一个渲染通道列表,并可选为所有通道初始化需要的通用状态; - SubShader渲染的时候,将优先渲染一个被每个通道所定义的对象;
- 通道的类型:RegularPass,UsePass,GrabPass;
- 在通道中定义状态同时对整个子着色器可见,那么所有的通道可以共享状态;
SubShader{
Tags{"Queue,"Transparent"}
Pass{
Lighting Off//关闭光照
...
}
}
(三)Tags
- Tags{“标签1”="value1"“key2”=“value2”}
- 标签的类型: Queue tag 队列标签; Render Type tag 渲染类型标签; DisableBatching tag
禁用批处理标签; ForceNoShadowCasting tag 强制不投阴影标签; IgnoreProjecttor tag
忽略投影标签; CanUseSpriteAtlas tag 使用精灵图集标签; PreviewType tag 预览类型标签;
(四)Pass
- SubShader包装了一个渲染方案,这些方案由一个个通道(Pass)来执行的,SubShader可以包括很多通道块,每个Pass都能使几何体渲染一次;
- Pass基本语法: Pass{[Name and Tags] [RenderSetup] [Texture Setup]}
Pass块的Name引用此Pass,可以在其它着色器的Pass块中引用它,减少重复操作,Name命令必须大写;
(五)RegularPass渲染设置
- Lighting光照:开启关闭定点光照On/Off;
- Material(材质块):材质,定义一个使用定点光照管线的材质;
- ColorMaterial:颜色集 计算定点光照时使用顶点颜色;
- SeparateSpecular:开光状态 开启或关闭顶点光照相关的镜面高光颜色,On/Off;
- Color:设置定点光照关闭时所使用的颜色;
- Fog(雾块):设置雾参数;
- AlphaTest:Alpha测试;
- ZTest:深度测试模式;
- Zwrite:深度写模式;
- Blend:混合模式;
- SourceBlendMode,DestBlendMode,AlphaSourceBlendMode,AlphaDstBlendMode;
- Offset偏移因子:设置深度偏移;
(六)特殊通道Pass
- UsePass:插入所有来自其它着色器的给定名字的通道;UsePass"Shader/Name",Name为着色器通道;
UsePass"Specular/BASE"//插入Specular中为Bass的通道; - GrabPass{}:一种特殊类型通道,他会捕获物体所在的位置的屏幕的内容,并写入一个纹理中,这个纹理能被用于后续通道中完成一些高级图像特效,后续通道可以使用_GrabTexure进行访问;
- GrabPass{“纹理名称”}捕获屏幕内容到指定纹理中,后续通道可以通过纹理名称来访问;
(七)Fallback
- 降级:定义在所有子着色器之后,如果没有任何子着色器能运行,则尝试降级;
- Fallback“着色器名称”;
- Fallback Off:没有降级,并且不会打印任何警告;
(八)Category分类
分类是渲染命令的逻辑组。例如着色器可以有多个子着色器,他们都需要关闭雾效果,和混合。
Shader"xxxx"{
Category{
Fog{Mode Off}
SubShader{...}
SubShader{...}
}
}