http://blog.csdn.net/zhuangyou123/article/details/26082181
效果:
Shader代码:
Shader "Esfog/NormalMap" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _NormalMap("NormalMap",2D) = "Bump"{} _SpecColor("SpecularColor",Color) = (1,1,1,1) _Shininess("Shininess",Float) = 10 } SubShader { Pass { Tags { "LightMode"="ForwardBase" } CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" uniform sampler2D _MainTex; uniform sampler2D _NormalMap; uniform float4 _SpecColor; uniform float _Shininess; uniform float4 _LightColor0; struct VertexOutput { float4 pos:SV_POSITION; float2 uv:TEXCOORD0; float3 lightDir:TEXCOORD1; float3 viewDir:TEXCOORD2; }; VertexOutput vert(appdata_tan v) { VertexOutput o; o.pos = mul(UNITY_MATRIX_MVP,v.vertex); o.uv = v.texcoord.xy; float3 normal = v.normal; float3 tangent = v.tangent; float3 binormal= cross(v.normal,v.tangent.xyz) * v.tangent.w; float3x3 Object2TangentMatrix = float3x3(tangent,binormal,normal); o.lightDir = mul(Object2TangentMatrix,ObjSpaceLightDir(v.vertex)); o.viewDir = mul(Object2TangentMatrix,ObjSpaceViewDir(v.vertex)); return o; } float4 frag(VertexOutput input):COLOR { float3 lightDir = normalize(input.lightDir); float3 viewDir = normalize(input.viewDir); float4 encodedNormal = tex2D(_NormalMap,input.uv); float3 normal = float3(2.0*encodedNormal.ag - 1,0.0); normal.z = sqrt(1 - dot(normal,normal)); float4 texColor = tex2D(_MainTex,input.uv); float3 ambient = texColor.rgb * UNITY_LIGHTMODEL_AMBIENT.rgb; float3 diffuseReflection = texColor.rgb * _LightColor0.rgb * max(0,dot(normal,lightDir)); float facing; if(dot(normal,lightDir)<0) { facing = 0; } else { facing = 1; } float3 specularRelection = _SpecColor.rgb * _LightColor0.rgb * facing * pow(max(0,dot(reflect(-lightDir,normal),viewDir)),_Shininess); return float4(ambient + diffuseReflection + specularRelection,1); } ENDCG } } FallBack "Diffuse" }
参数设置: