Shader ".../ShaderName"
{
//本shader中所调用的属性
Properties
{
//属性设置
[外部限定]内部使用的name(“外部使用的name”,属性的类型) = 默认的值
_Color("color",Color)=(1,1,1,1) //颜色,一般用fixed4
_Vector("vector",Vector)=(1,2,3,4) //向量类型,float4
_Int("int",Int)=123//整数
_Float("float",Float)=5.5 //小数,不像c#里需要加f
_Range("range"Range(1,10))=10 //范围,括号里是范围,本质上就是Float,只是对Float做了一个限制。
_2D("texture",2D)="white"{} white指的是在没有图片的时候使用的颜色。
_Cube("cube",Cube)="white"{}//这里的cube是天空盒子。
_3D("texture",3D)="white"{}//3d纹理
}
//1号顶点着色器
SubShader
{
LOD 100
//1号顶点着色器标签
Tags
{
//定义渲染顺序
"Queue"="Transparent"
//是否接受projector组件的投影
"IgnoreProjector"="True"
//替换所有符合类型的shader 用C#接口来进行控制
"RenderType"="Transparent"
//UI浏览的类型设置
"PreviewType"="Plane"
//设置能否使用图集
"CanUseSpriteAtlas"="True"
}
//## 模板测试
Stencil
{
//将属性中的默认参数传入,unity会自动调整并且筛选可渲染的区域
//设置ref参考值
Ref
//设置ref参考值跟几何缓存之间通过测试的方法
//默认为always = 8总是通过 Never = 1总是失败
//判断ref&readMask 与 Gbuffer&readmask Greater = 5 操作为> Less = 2操作为<
// GEqual = 7 操作为>= LEqual = 4 操作为<= Equal = 3操作为= NotEqual = 6 操作为!=
Comp
//当模板测试和深度测试都通过之后 对其几何缓存的处理
Pass
//当模板测试跟深度测试都失败之后 对其几何缓存的处理
Fail
//只有深度测试通过之后 对其几何缓存的处理
ZFail
//以上对其几何缓存的处理 默认为Keep = 0 保留当前缓存中的内容 即Gbuffer不变
//Zero = 1 将0写入缓存 Gbuff =0 replace = 2 将 ref写入缓存 Gbuff=ref Invert = 5 将当前模板的Gbuff取反
//incrsat = 3 将Gbuff的值+1 如果超过255 则保留为255 DecrSat = 4 将Gbuff的值-1 如何超过0 则保留为0
//IncrWarp = 6 将Gbuff的值+1 如果超过255 则从0自增 DecrWarp = 7 将Gbuff的值-1 如何超过0 则从255自减
//读取遮罩 该值将和ref以及Gbuffer进行&操作 但是不对ref和Gbuffer进行修改
ReadMask
//写入遮罩 该值将和ref以及Gbuffer进行&操作 同时修改Gbuffer的值
WriteMask
}
//## 深度测试
//渲染正反面的设置
Cull Off
Lighting Off
//判断开启/关闭深度写入 是否能把Z值存入深度缓存
ZWrite Off
//根据当前像素深度与深度缓存中Z值进行比较 测试通过之后 把像素对应的color写入颜色缓存
ZTest [unity_GUIZTestMode]
//颜色混合
// One 使用它将保持source或destination的完整的颜色
//Zero 使用它将移除source或destination的值
//SrcColor 使用它将乘以source颜色值
//SrcAlpha 使用它将乘以source的alpha值
//DstColor 使用它将乘以frame buffer中的source颜色值
//DstAlpha 使用它将乘以frame buffer中的source的alpha值
//OneMinusSrcColor 使用它将乘以(1-source颜色值)
//OneMinusSrcAlpha 使用它将乘以(1-source的alpha值)
//OneMinusDstColor 使用它将乘以 (1 - destination颜色值)
//OneMinusDstAlpha 使用它将乘以 (1 - destination的alpha值)
Blend SrcAlpha OneMinusSrcAlpha
//雾效 模式
off 关闭雾效
Global 默认
Linear 线性
EXP 一次指数
EXP2 二次指数
Fog{ Mode off }
//设定雾的颜色
Color ColorValue
//以指数的方式 设定 雾的密度
Density FloatValue
//为linear的雾设定远近距离
Range FloatValue , FloatValue
//通过对RGBA通道不同通道的遮罩展示不同的颜色 当为0时 则什么都不显示
Alpha = 1 只通过A
Blue = 2 只通过B
Green = 4 只通过G
Red = 8 只通过R
All = 15 全部通过
ColorMask [_ColorMask]
//通道,每次通道都可以进行一次渲染
Pass
{
Name "Default"
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 2.0
#include "UnityCG.cginc"
#include "UnityUI.cginc"
#pragma multi_compile __ UNITY_UI_ALPHACLIP
//将空间坐标转换为顶点坐标的结构体
struct appdata_t
{
//裁剪坐标
float4 vertex : POSITION;
//色彩缓存颜色
float4 color : COLOR;
//裁剪坐标对应纹理坐标
float2 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
//将顶点坐标转换成片元坐标的结构体
struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
float4 worldPosition : TEXCOORD1;
UNITY_VERTEX_OUTPUT_STEREO
};
//定义属性中的字段 在着色器中使用
fixed4 _Color;
fixed4 _TextureSampleAdd;
float4 _ClipRect;
//顶点函数 将a2v结构体传入 输出V2f结构体
v2f vert(appdata_t v)
{
//定义输出结构体
v2f OUT;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
OUT.worldPosition = v.vertex;
OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);
OUT.texcoord = v.texcoord;
OUT.color = v.color * _Color;
return OUT;
}
sampler2D _MainTex;
//片元函数 将V2F结构体传入 输出色彩结构体
fixed4 frag(v2f IN) : SV_Target
{
half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
color.a = pow(color.a, 1.45f);
#ifdef UNITY_UI_ALPHACLIP
clip (color.a - 0.001);
#endif
return color;
}
ENDCG
}
}
}