TA之路——Shader学习07(基础纹理之凹凸映射)


Shader "MyShader/11_NormalMap"{

	Properties{
		_Single("Single Color",Color) = (1,1,1,1)
		_MainTex("_Main Tex",2D) = "white"{}
		_NormalMap("Normal Map",2D)="bump"{}
		_BumpScale("BunpScale",Float)=1

	}

		SubShader{
		
			Pass{
			Tags{ "LightMode" = "ForwardBase" }
			CGPROGRAM
			#include "Lighting.cginc"
			#include "UnityCG.cginc"

			#pragma vertex vert
			#pragma fragment frag

			fixed4  _Single;
			sampler2D _MainTex;
			float4 _MainTex_ST;
			sampler2D _NormalMap;
			float4 _NormalMap_ST;
			float _BumpScale;



			struct v2f {
				float4 pos:SV_POSITION;
				float3 lightDir:TEXCOORD0;
				float4 worldVertex : TEXCOORD1;
				float4 uv:TEXCOORD2;
			};

			v2f vert(appdata_full v) {
				v2f f;
				f.pos = UnityObjectToClipPos(v.vertex);
				
				f.worldVertex = mul(v.vertex, unity_WorldToObject);
				f.uv.xy = v.texcoord.xy*_MainTex_ST.xy + _MainTex_ST.zw;
				f.uv.zw = v.texcoord.xy*_NormalMap_ST.xy + _NormalMap_ST.zw;
				TANGENT_SPACE_ROTATION;//调用这个宏之后会得到一个矩阵rotation,这个矩阵把模型空间下的方向转换成切线空间下
				f.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));//ObjSpaceLightDir(v.vertex)得到模型空间下的平行光方向
				return f;
			}

			fixed4 frag(v2f o) :SV_Target{
				fixed4 normalColor = tex2D(_NormalMap,o.uv.zw);//将计算好的法线坐标和法线贴图进行对应

				fixed3 tangentNormal = normalize(UnpackNormal(normalColor));//切线空间下的法线

				tangentNormal.xy = tangentNormal.xy*_BumpScale;//凹凸参数控制凹凸程度



				fixed3 albedo = tex2D(_MainTex,o.uv.xy).rgb*_Single.rgb;//将计算好的纹理坐标和纹理贴图进行对应并与纹理颜色融合

				fixed3 ambient0 = UNITY_LIGHTMODEL_AMBIENT.rgb*albedo;

				fixed3 lightDir = normalize(o.lightDir);//把平行光方向单位化

				fixed3 halfLambert = dot(lightDir, tangentNormal)*0.5 + 0.5;

				fixed3 Diffuse0 = _LightColor0.rgb*albedo*halfLambert;//漫反射

				fixed3 tempColor = Diffuse0 +ambient0;

				return fixed4(tempColor,1);
			}


		ENDCG

		}

	}
		Fallback "VertexLit"
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值