<Shader>透明效果+纹理融合 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"
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值