Unity Shader Lab新手宝典简单Shader案例一:流光效果 + 相关基础知识说明
Shader "Samples/Light Flow"//shader名称
{
Properties//开放到材质面板的属性
{
_Tex("Texture",2D) = "white"{
}
_Color("Color",Color) = (0,1,1,1)
//关键词枚举,0为X方向,1为Y方向
[KeywordEnum(X,Y)] _DIRECTION("Flow Direction",float) = 0
_Speed("Flow Speed",float) = 1
}
SubShader//下面是shader的主要内容
{
Tags{
"RenderType" = "Transparent" "Queue" = "Transparent"}//标签,通过键值对的形式声明,没有数量限制。
//RenderType(渲染类型)标签:将Shader划分为不同类别,用于后期进行Shader替换,或者产生摄像机的深度纹理
//所有可使用的渲染类型:Opaque\Transparent\TransparentCutout\Background\Oberlay\TreeQpaque\TreeTransparentCutout\TreeBillboard\Grass\GrassBillboard
//Queue(队列)标签:确定物体的渲染顺序
//Unity预先定义的五种渲染队列:Background\Geometry\AlphaTest\Transparent\Overlay
Blend One One//混合模式,线性减淡
Cull Off//渲染状态,Cull Back\Front\Off,设置多边形的剔除方式,有背面剔除、正面剔除、不剔除,默认为Back,可以放到Pass内。
Pass
{
CGPROGRAM//接下来是CG语言
//编译指令
#pragma vertex vert//定义顶点着色器的名称,通常使用vert
#pragma fragment frag//定义片段着色器名称,通常使用frag
//定义枚举关键词
#pragma shader_feature _DIRECTION_X _DIRECTION_Y
#include"unityCG.cginc"//导入包含文件
struct v2f
{
float2 texcoord : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _Tex;
float4 _Tex_ST;
fixed4 _Color;
float _Speed;
v2f vert (appdata_base v)
{
v2f o;
o.texcoord = TRANSFORM_TEX(v.texcoord,_Tex);
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
float4 frag(v2f i) : SV_Target
{
float2 texcoord;
//判断流动方向
#if _DIRECTION_X
texcoord = float2(i.texcoord.x + _Time.x * _Speed, i.texcoord.y);
#elif _DIRECTION_Y
texcoord = float2(i.texcoord.x, i.texcoord.y + _Time.x * _Speed);
#endif
return tex2D(_Tex,texcoord) * _Color;
}
ENDCG
}
}
}
可以设置的渲染类型
类型名称 | 描述 |
---|---|
Opaque | 用于普通Shader,例如:不透明、自发光、反射、地形Shader |
Transparent | 用于半透明Shader,例如:透明、粒子 |
TransparentCutout | 用于透明测试Shader,例如:植物叶子 |
BackGround | 用于Skybox Shader |
Overlay | 用于GUI纹理、Halo、Flare Shader |
TreeOpaque | 用于地形系统中的树干 |
TreeTransparentCutout | 用于地形系统中的树叶 |
TreeBillboard | 用于地形系统中的Billboard树 |
Grass | 用于地形系统中的草 |
GrassBillboard | 用于地形系统中的Billboard草 |
Unity预定义的五种渲染队列
队列名称 | 描述 | 队列号 |
---|---|---|
Background | 最先执行渲染,一般用来渲染天空盒(Skybox)或者背景 | 1000 |
Geometry | 非透明的集合体通常使用这个队列,当没有声明渲染队列的时候,Unity默认使用这个队列 | 2000 |
AlphaTest | Alpha测试的几何体会使用这个队列,之所以从Geometry队列单独拆分出来,是因为当所有实体都绘制完之后再绘制Alpha测试会更高效 | 2450 |
Transparent | 在这个队列的几何体按由远及近的顺序进行绘制,所有进行Alpha混合的几何体都应该使用这个队列,例如玻璃材质、粒子特效等 | 3000 |
Overlay | 用来叠加渲染的效果,例如镜头光晕等,放在最后渲染 | 4000 |
除了使用这些Unity预定义的渲染队列外,也可以自己指定一个队列,例如:
Tags{
"Queue" = "Geometry + 1"}
这就是表示队列号为2000+1的队列号,在所有非透明几何体绘制完后再进行绘制。