遮罩紋理Shader

來自 shader 入門精要 Chapter7 

 

Shader "Chapter7/Mask Texture"
{
	Properties
	{
		_Color("Color Tint",Color) = (1,1,1,1)
		_MainTex("Main Tex",2D) = "white"{}
		_BumpMap("Normal Map",2D) = "bump"{}
		_BumpScale("Bump Scale",Float) = 1.0
		_SpecularMask("Specular Mask",2D) = "white"{}
		_SpecularScale("Specular Scale",Float) = 1.0
		_Specular("Specular",Color) = (1,1,1,1)
		_Gloss("Gloss",Range(8.0,256)) = 20
	}
	SubShader{
		Pass{
			Tags{"RenderType" = "ForwardBase"}

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag 
			#include "Lighting.cginc"

			fixed4 _Color;
			sampler2D _MainTex;
			float4 _MainTex_ST;
			sampler2D _BumpMap;
			float _BumpScale;
			sampler2D _SpecularMask;
			float _SpecularScale;
			fixed4 _Specular;
			float _Gloss;

			struct a2v{
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float4 tangent: TANGENT;
				float4 texcoord: TEXCOORD0;
			};

			struct v2f{
				float4 pos: POSITION;
				float2 uv: TEXCOORD0; 
				float3 lightDir: TEXCOORD1;
				float3 viewDir: TEXCOORD2;
			};

			v2f vert(a2v v){
				v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.vertex,_MainTex);

				TANGENT_SPACE_ROTATION;
				// 儘可用於前向渲染中。輸入一個模型空間中的頂點位置,返回世界空間中從該點到光源的光照方向。內部實現使用了   
				// UnityWorldSpaceLightDir函數。沒有被歸一化。
				o.lightDir = mul(rotation,ObjSpaceLightDir(v.vertex)).xyz;
                // 輸入一個模型空間中的頂點位置,返回模型空間中從該點到攝像機的觀察方向。
				o.viewDir = mul(rotation,ObjSpaceViewDir(v.vertex)).xyz;
				return o;
			}

            //  使⽤遮罩紋理的地⽅是⽚元着⾊器。我們使⽤它來控制模型表⾯的⾼光反射強度
			fixed4 frag(v2f i):SV_TARGET0{
                fixed3 tangentLightDir = normalize(i.lightDir);
				fixed3 tangentViewDir = normalize(i.viewDir);

				fixed3 tangentNormal = UnpackNormal(tex2D(_BumpMap,i.uv));
                tangentNormal.xy *= _BumpScale;
				tangentNormal.z = sqrt(1.0 - saturate(dot(tangentNormal.xy, tangentNormal.xy)));

				fixed3 aldebo = tex2D(_MainTex,i.uv).rgb * _Color.rgb;

				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * aldebo;

				fixed3 diffuse = _LightColor0.rgb * aldebo * max(0,dot(tangentNormal,tangentLightDir));

				fixed3 halfDir = normalize(tangentLightDir + tangentViewDir);

				fixed3 specularMask = tex2D(_SpecularMask,i.uv).r * _SpecularScale;

				fixed3 specular = _LightColor0.rgb *_Specular.rgb * pow(max(0,dot(tangentNormal,halfDir)),_Gloss);

				return fixed4(ambient + diffuse + specular,1.0);

			}

			ENDCG
		}	
	
	}	
	Fallback "Specular"	
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章