// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Unity Shader Book/Chapter 8/AlphaTest"
{
Properties
{
_Diffuse("Diffuse", Color) = (1, 1, 1, 1)
_MainTex("Main Tex", 2D) = "white"{}
_Cutoff("Alpha Cutoff", Range(0, 1)) = 0.5
}
SubShader
{
//Queue渲染队列
// Background 1000 这个渲染队列会在任何其他队列之前被渲染,我们通常使用该队列来渲染那些需要绘制的背景上的物体
// Geometry 2000 默认的渲染队列,大多数物体都是用这个队列。不透明物体使用这个队列
// AlphaTest 2450 需要透明的测试的物体使用这个队列。在Unity5中它从Geometry队列中被单独分出来,
// 这是因为在所有不透明的物体渲染之后在渲染它们会更加高效
// Transparent 3000 这个队列中的物体会在所有Geometry和AlphaTest物体选然后,在按从后往前的顺序进行渲染。
// 任何使用了透明度混合(例如关闭了深度写入的shader)的物体都应该使用该队列。
// Overlay 4000 该队列用于实现一些叠加效果。任何需要在最后渲染的物体都应该使用该队列。
//IgnoreProjector=true 不会受到投影器的影响
//RenderType 标签通常被用于着色器替换功能
Tags{"Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout"}
//把当前屏幕的图像绘制在_RefractionTex纹理中,后续的Pass可以访问它
//GrabPass { "_RefractionTex" }
Pass
{
//sampler2D _RefractionTex;
//float4 _RefractionTex_TexelSize;
/*
LightMode标签支持的渲染路径设置选项
Always 不管使用哪种渲染路径,该Pass总是会被渲染,但不会计算任何光照
ForwardBase 用于前向渲染。该Pass会计算环境光、最重要的平行光、逐顶点/SH 光源和Lightmaps
可实现光照效果:光照纹理、环境光、自发光、阴影(平行光的阴影)
ForwardAdd 用于前向渲染。该Pass会计算额外的逐像光源,每个Pass对应一个光源
可实现光照效果:默认的情况下不支持阴影,但可以通过使用#pragmamulti_compile_fwdadd_fullshadows编译指令来开启阴影
Deferred 用于延迟渲染。该Pass会渲染G缓冲(G-buffer)
ShadowCaster 把物体的深度信息渲染到阴影映射纹理(shadowmap)或一张深度纹理中
PrepassBase 用于遗留的延迟渲染。该Pass会渲染法线和高光反射的指数部分
PrepassFinal 用于遗留的言辞渲染。该Pass通过合并纹理、光照和自发光来渲染得到最后的颜色
Vertex、VertexLMRGBM和VertexLM 用于遗留的顶点照明渲染
*/
Tags{ "LightMode" = "ForwardBase" }
/*
Blend SrcAlpha OneMunusSrcAlpha //正常(Normal),即透明度混合
Blend OneMinusDstColor One //柔和相加(Soft Additive)
Blend DstColor Zero //正片叠底(Multiply),即相乘
Blend DstColor SrcColor //两倍相乘(2x Multiply)
BlendOp Min //变暗(Darken)
Blend One One
BlendOp Max //变亮(Lighten)
Blend One One
Blend OneMinusDstColor One //滤色(Screen)
Blend One OneMinusSrcColor //等同于
Blend One One //线性减淡(Linear Dodge)
*/
/*
ZWrite可以取的值为:On/Off,默认值为On,代表是否要将像素的深度写入深度缓存中
*/
/*
Cull指令来控制需要剔除哪个面的渲染图元。
Cull Back 剔除背面,背面不会渲染
Cull Front 剔除正面,正面不会渲染
Cull Off 关闭剔除功能,所有的渲染图元都会被渲染
*/
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};
struct v2f
{
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD0;
float3 worldPos : TEXCOORD1;
float2 uv : TEXCOORD2;
};
fixed4 _Diffuse;
sampler2D _MainTex;
float4 _MainTex_ST;
fixed _Cutoff;
v2f vert(a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex); //模型裁剪空间的坐标
o.worldNormal = UnityObjectToWorldNormal(v.normal); //将法线方向转换成世界空间方向
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;//模型在世界空间中的位置
//uv坐标 = 自身缩放 * 主贴图缩放 + 偏移值
o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.wz; //主贴图的uv坐标
// o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
//贴图颜色
fixed4 texColor = tex2D(_MainTex, i.uv);
//对alpha通道设置透明化
clip(texColor.a - _Cutoff);
//自身颜色 = 贴图颜色 * 设置颜色
fixed3 albedo = texColor.rgb * _Diffuse.rgb;
//漫反射 = 系统灯光颜色 * 自身颜色
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
//法线方向
fixed3 worldNormal = normalize(i.worldNormal);
//灯光方向
fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
//漫反射 = 灯光颜色 * 自身颜色 * 反射角度
fixed3 diffuse = _LightColor0.rgb * albedo * saturate(dot(worldNormal, worldLight));
return fixed4(ambient + diffuse, 1);
}
ENDCG
}
}
Fallback "Transparent/Cutout/VertexLit"
}