透明度测试8.3

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'


//8.3透明度测试
Shader "Unlit/Chapter8-AlphaTest"
{
	Properties
	{
		_Color("Main Tint",Color)=(1,1,1,1)
		_MainTex("Main Tex",2D) = "white"{}
	//定义属性CutOff,范围在0到1之间,用于决定我们调用clip进行透明度测试时使用的判断条件
		_Cutoff("Alpha Cutoff",Range(0,1))=0.5
	}
		SubShader{
			//subshader的Queue标签决定我们使用的渲染队列,AlphaTest:透明度测试
			//RenderType标签可以让Unity把这个shader归入到提前定义的组中,以指明该Shader是一个使用了透明测试的shader,RenderType标签通常被用于着色器的替换功能
		Tags{"Queue" = "AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
		pass{
			//LightMode标签是Pass标签的一种,用于定义该pass在unity光照流水线中的角色,只有定义了正确的LightMode,我们才能正确得到一些Unity内置光照变量,例如_LightColor0
		Tags{"LightMode" = "ForwardBase"}

		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
			//为了使用Unity内置的一些变量,如_LightColor0,还需要包含进Unity的内置文件Lighting.cginc
#include"Lighting.cginc"

		fixed4 _Color;
		sampler2D _MainTex;
		float4 _MainTex_ST;
		//CutOff的精度是0到1之间,所以用fixed精度来储存
		fixed _Cutoff;

		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;
		};

		//在顶点着色器计算出世界空间的法线方向和顶点位置以及变换后的纹理坐标
		v2f vert(a2v v) {
			v2f o;
			o.pos = UnityObjectToClipPos(v.vertex);
			//世界空间下的法线方向
			o.worldNormal = UnityObjectToWorldNormal(v.normal);
			//世界空间下的坐标方向
			o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
			//变换后的纹理坐标
			o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
			return o;
		}

		//片元着色器 包含透明度测试代码
		fixed4 frag(v2f i) :SV_Target{
			//归一化世界空间下的法线
			fixed3 worldNormal = normalize(i.worldNormal);
			//归一化世界空间下的光源方向
			fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
			//对主纹理进行采样
			fixed4 texColor = tex2D(_MainTex, i.uv);
			
			//Alpha test(透明度测试)
			/*clip函数:是CG的一个函数,通常在片元着色器中用于透明度测试,
			void clip(floatn x);
			如果给定参数的任何一个分量是负数,就会舍弃当前像素的输出颜色*/
			clip(texColor.a - _Cutoff);
			/*Equal to(也可以写成if语句的判断)
			if((texColor.a-_Coloroff)<0.0){
			//discard指令来显式剔除该片元
				discard
			}
			*/
			//反射率
			fixed3 albedo = texColor.rgb*_Color.rgb;
			//环境光照
			fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;
			//漫反射
			fixed3 diffuse = _LightColor0.rgb*albedo*max(0, dot(worldNormal, worldLightDir));
			return fixed4(ambient + diffuse, 1.0);
		}
			
		ENDCG
		}
		}
			//这不仅能够保证在我们编写的subshader无法在当前显卡上工作时可以有合适的代替subshader,还可以保证使用透明度测试的物体可以正确地向其他物体投射阴影
				Fallback"Transparent/Cutout/VertexLit"
}

猜你喜欢

转载自blog.csdn.net/ABigDeal/article/details/82256992
今日推荐