学习笔记 整理来至《Unity Shader入门精要》
一个Unity Shader 的基础结构如下;
Shader "Name" {
Properties {
//开放到材质面板的属性
}
SubShader{
//SubShader可以写多个
}
FallBack "Vertexlit"
}
属性类型 | 例子 | 对应CG变量类型 |
Int | _Int("Int",Int) = 2 |
float,half,fixed |
Float | _Float("Float",Float) = 4.5 |
float,half,fixed |
Range(min,max) | _Range("Range",Range(1,10)) = 5 |
float,half,fixed |
Color | _Color("Color",Color) = (1,1,1,1) |
float4,half4,fixed4 |
Vector | _Vector("Vector",Vertex) = (1,2,3,4) |
float4,half4,fixed4 |
2D | _2D("Texture",2D) = "white"{} |
sampler2D |
Cube | _Cube("Cube",Cube) = "black"{} |
samplerCube |
3D | _3D("3D",3D) = ""{} |
sampler3D |
float 高精度类型,32位,通常用于世界坐标下的位置,纹理UV,或涉及复杂函数的标量计算,如三角函数、幂运算等
half 中精度类型,16位,数值范围为[-60000,+60000],通常用于本地坐标下的位置、方向向量、HDR颜色等
fixed 低精度类型,11位,数值范围为[-2,+2],通常用于常规的颜色与贴图,以及低精度间的一些运算变量等
比较常用的一个规则是,除了位置和坐标用float以外,其余的全部用half,颜色用fixed
subshader 语义中包含的定义通常如下:
Subshader{
//可选的
[Tags]
//可选的
[RenderSetup]
Pass{
}
//其他Pass
}
状态名称 | 设置指令 | 解释 |
Cull | Cull Back/Front/Off | 设置剔除模式:剔除背面/正面/关闭剔除 |
ZTest | ZTest Less Greater/LEqual/GEqual/ Equal/NotEqual/Always |
设置深度测试时使用的函数 |
ZWrite | ZWrite On/ Off | 开启/关闭深度写入 |
Blend | Blend SrcFactor DstFactor | 开启并设置混合模式 |
在SubShader中设置了上述渲染状态时,将会应用到所有的Pass
subshader 的标签(Tags)的结构如下:
Tags {"TagName1"="Valuel" "TagName2" = "Value2"}
标签类型 | 说明 | 例子 |
Queue | 控制渲染顺序,制定该物体属于哪一个渲染列队,通过这种方式可以保证所有的透明物体可以在所有不透明物体后面被渲染,我们也可以自定义使用的渲染列队来控制物体的渲染顺序 | Tags{"Queue"="Transparent"} |
RenderType | 对着色器进行分类,列如这是一个不透明的着色器,或是一个透明的着色器等.这可以被用于着色器替换(Shader Replacement)功能 | Tags{"RenderType"="Opaque"} |
DisableBatching | 一些SubShader在使用Unity的批处理功能时会出现问题,列如使用了模型空间下的坐标进行顶点动画,这时可以通过该标签来直接指明是否对该SurShader使用批处理 | Tags{"DisableBatching"="True"} |
ForceNoShadowCasing | 控制使用该SubShader的物体是否会投射阴影 | Tags{"ForceNOShadowCasting"="True"} |
IgnoreProjector | 如果该标签值为"True",那么使用该SubShader的物体将不会受Porjector的影响,通常用于半透明物体. | Tags{"IgnoreProjector"= "True"} |
CanUseSpriteAtlas | 当该SubShader是用于精灵(sprites)时,将该标签设置为"False" | Tags{"CanUseSpriteAtlas"="False"} |
PreviewType | 指明材质面板将如何预览该材质,默认情况下,材质将显示为一个球形,我们可以通过把该标签的值设为"Plane","SkyBox"来改变预览类型 | Tags{"PreviewType"="Plane"} |
上述标签仅可以在SubShader中声明,不可以在Pass中声明
标签类型 | 说明 | 例子 |
LightMode | 定义该Pass在Unity的渲染流水线中的角色 | Tags{"LightMode"="ForwardBase"} |
RequireOptions | 用于指定当满足某些条件时才渲染该Pass,他的值是一个由空格分隔的字符串.目前,Unity支持的选项有:SoftVegetation. | Tags{"RequireOptions"="SoftVegetation"} |
特殊Pass标签:
UsePass:如我们之前提到的一样,可以使用该命令来复用其他Unity Shader中的Pass
GrabPass: 该Pass负责抓取屏幕并将结果存储在一张纹理中,以用于后续的Pass处理