透明效果+紋理融合 vertex和fragment

shader "Custom/VertexFragment003"{
	Properties{
		_MainColor("Main Color:",color) = (1,1,1,1)
		_MainTexture("Main Texture",2d) = "white" {}
		_SpecularColor("Specular Color:",color) = (1,1,1,1)
		_SpecularShininess("shininess Range",range(0,100)) = 10
	}

	SubShader{
		pass
		{
			Tags{ "LightMode" = "ForwardBase" }

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag

			float4 _LightColor0;
			float4 _MainColor;
			float4 _SpecularColor;
			sampler2D _MainTexture;
			float _SpecularShininess;


			//頂點輸入的信息
			struct appData{
				float4 vertex:POSITION;	//頂點的座標
				float3 normal:NORMAL;	//頂點的法向量
				float2 texcoord:TEXCOORD0;	//一級紋理UV座標
			};

			//頂點着色器輸出的結構
			struct v2f{
				float4 pos:SV_POSITION; //頂點像素的位置
				float3 normal:NORMAL;	//頂點法線的位置
				float2 texure0:TEXCOORD0; //一級紋理的座標
				float4 worldPos:TEXCOORD1;	//在世界座標中的位置
			};

			v2f vert(appData IN)
			{
				v2f OUT;
				OUT.pos 	= mul(UNITY_MATRIX_MVP,IN.vertex);  //mvp的座標
				OUT.normal  = mul(float4(IN.normal,0.0),unity_ObjectToWorld).xyz;
				OUT.worldPos =  mul(unity_ObjectToWorld,IN.vertex); 
				OUT.texure0  = IN.texcoord;  //輸出的紋理就等於輸入的紋理

				return OUT;
			}

			float4 frag(v2f IN):COLOR
			{
				float4 textColor = tex2D(_MainTexture,IN.texure0);
				//計算diffuse = MainColor * LightColor * max(0,dot(N,L))
				float3 normalDirection = normalize(IN.normal);
				float3 lightDiretion   = normalize(_WorldSpaceLightPos0.xyz);
				float3 viewDirection   = normalize(_WorldSpaceCameraPos - IN.worldPos.xyz);

				float3 diffuseColor;	//計算出 diffuse = maincolor * lightColor * max(0,dot(N,L))
				float3 specularColor;  //specula = mainColor * specularColor * pow( max(0,dot(r,v)),shininess )  R = reflet(-N,L)

				if (dot(normalDirection,lightDiretion) < 0.0){
					diffuseColor = float3(0,0,0);
				}
				else{
					diffuseColor = _MainColor.rgb * _LightColor0.rgb * max(0,dot(normalDirection,lightDiretion)); 
				}

				float3 reflectDirection = reflect(-normalDirection,lightDiretion);
				specularColor = _MainColor * _SpecularColor * pow(max(0,dot(reflectDirection,viewDirection)),_SpecularShininess);

				float4 finalColor = float4(diffuseColor,1.0) + float4(specularColor,1.0) + UNITY_LIGHTMODEL_AMBIENT;
				//將漫反射 鏡面反射  環境光 乘以紋理的顏色值  極爲最終的顏色值。

				return finalColor  * textColor;
			}

			ENDCG

		}
	}
	FallBack "Diffuse"
}

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