UnityShader的基本结构
Shader语义块
//Shader的名字
Shader "Custom/YourShaderName"{
}
Properties语义块
Shader "Custom/YourShaderName"{
Properties{
//暴露给Shader监视面板的属性
_Color("Color Tint",Color) = (1.0,1.0,1.0,1.0)
}
}
SubShader语义块
Shader "Custom/YourShaderName"{
Properties{
_Color("Color Tint",Color) = (1.0,1.0,1.0,1.0)
}
SubShader{
//子着色器SubShader中定义了一系列的标签设置[Tags]、渲染状态设置[RenderSetup]、Pass通道
Pass{
//Pass通道中也可以定义[Tags]、[RenderSetup]
//区别是在SubShader进行的设置会作用于所有的Pass
}
}
}
一、SubShader的标签设置
SubShader的标签[Tags]本质上是一个键值对(Key/Value Pair),它的键和值都是字符串类型,即每一个标签都有一个key对应一个value,key与key之间空格隔开。
例如:
Tags{"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
1.1 ”Queue”渲染队列标签——“Queue”控制渲染顺序,指定该物体属于哪一个渲染队列,Shader在渲染前决定物体属于哪个渲染顺序,从而确保所有透明或半透明物体的绘制顺都排在不透明物体的后面
其包括的值有:
(1)”Background”:1000。这种类型的顺序会排在所有物体的前面。例如天空盒。
(2)”Geometry”:2000。所有不透明物体及大多数物体使用这个类型。
(3)”AlphaTest”:2450。使用Alpha Test的物体使用这个类型的渲染顺序。它被排在不透明物体的渲染后面。
(4)”Transparent”:3000。排在Geometry和AlphaTest后渲染。所有alpha混合的物体都应该选择这个类型。
(5)”Overlay”:4000。这一类是最后渲染的,比前面所有类型都要置后,例如镜头光晕。
(6)用户自定义值:比如”Queue”=”Geometry+10”。
1.2 “RenderType”渲染类型标签——主要用于识别与替换,从而使Unity可以在运行时给特定Camera替换特定的RenderType下的所有Shader。与Camera.RenderWithShader或者Camera.SetReplacementShader函数配合使用。
(1)”Opaque”:大部分不透明的物体都使用这个。
(2)”Transparent”:大部分透明的物体、包括粒子特效都使用这个;
(3)”Background”:天空盒都使用这个;
(4)”Overlay”:GUI、镜头光晕都使用这个;
(5)用户自定义RenderType字符串。
1.3 "DisableBatching"标签——设置该物体上的Draw Call Batching,表明是否使用批处理。
其包括的值有:
(1)True,设置当前物体Draw Call Batching关闭
(2)False,默认值为False ,设置当前物体Draw Call Batching打开
(3)LODFading,只有LOD Fading设置被开启时关闭该物体上的Draw Call Batching。
1.4 ”ForceNoShadowCasting”标签——设置该Subshader的物体是否会投射阴影,默认为False的,即默认状态下物体会去绘制阴影部分的渲染。
1.5 ”IgnoreProjector”标签——设置该SubShader的物体是否受Projector的影响,默认状态下是False,即在默认状态下物体能够响应Projector投射的阴影绘制。
1.6 ”CanUseSpriteAtlas”标签——针对图集里的元素的,UGUI中经常使用。当CanUseSpriteAtlas为False时,将不会对打进图集里的贴图进行绘制。默认为True。
1.7 “PreviewType”标签——设置编辑器Material材质球展示材质预览效果时的形状,默认球形,通过这个标签,可以设置为Plane面板形状或者Skybox天空盒形状。
以上标签可以在SubShader子着色器下以及Pass下定义
二、SubShader的渲染状态设置
ShaderLab提供了一系列渲染状态的设置,这些指令可以设置显卡的各种状态,例如是否开启混合/深度测试等。
2.1 Cull Cull Back|Front|Off
设置剔除模式,剔除背面|正面|关闭剔除 默认CullBack
2.2 ZTest ZTest Less Greater|LEqual|GEqual|Equal|NotEqual|Always
设置深度测试,默认ZTest LEqual即小于或等于目标深度才能被渲染
2.3 ZWrite ZWrite On|Off
设置深度写入,默认ZWrite On
2.4 Blend Blend SrcFactor DstFactor
开启并设置混合模式
2.5 Offset Factor Units
设置深度缓存的偏移量,Factor偏移缩放大小和Units偏移量。Factor相当于缓存数据偏移放大的倍数,Units相当于直接偏移的量。
SubShader的渲染状态也可以在Pass中定义
三、Pass语义块
Pass通道是最为重要的一部分,因为我们大部分的代码都是写在Pass语义块中的。
Pass通道的标签设置
3.1 “LightMode”标签——指定Pass和Unity的哪一种渲染路径(“Rendering Path”)搭配使用。
(1)ForwardBase
(2)ForwardAdd
(3)Always,永远都渲染,但不处理光照。
(4)ShadowCaster,用于渲染产生阴影的物体。
(5)ShadowCollector,用于收集物体阴影到屏幕坐标Buff里。
CG代码块
Shader "Custom/YourShaderName"{
Properties{
_Color("Color Tint",Color) = (1.0,1.0,1.0,1.0)
}
SubShader{
Pass{
CGPROGRAM
//CG代码块
ENDCG
}
}
}
编译指令
//指定顶点、片元函数
#pragma vertex vert
#pragma fragment frag
定义结构体a2v、v2f
struct a2v{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
}
struct v2f{
float4 pos : SV_POSITION;
fixed3 color : COLOR0;
}
- POSITION语义告诉unity将模型空间中顶点的位置信息填充至特定参数
- NORMAL语义告诉unity将模型空间中顶点的法线方向填充至特定变量
- TEXCOORD0语义告诉unity将模型的第一套纹理坐标填充至特定变量
- COLOR0语义告诉unity,该变量储存了一个颜色信息
- SV_POSITION语义告诉unity,该变量中包含了顶点在剪裁空间的位置信息
- SV_Target语义告诉渲染器将用户的输出颜色存储到一个渲染目标(Render Target)中,默认存储带帧缓存中
PS:在unity中POSITION、NORMAL、TANGENT这些数据都是由Unity的MeshRender组件提供的,在每帧调用Draw Call时,MeshRender组件会把它所负责渲染的模型数据发送给shader
定义顶点着色器
定义片元着色器
Fallback语义块
REF
书籍:
OpenGL超级宝典、UnityShader入门
博客: