Unity2D实现贴图凹凸感并接受实时光照效果
先看终于效果:
我们的原图是一个3D模型的截图:
这一效果是通过Shader实现的:
(Shader代码来自国外博客:http://www.thomas-joncorpuz.com/blog/2014/11/30/custom-unity-2d-sprite-shader)
Shader "Custom/SpriteNormal" { Properties { [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} _NormalsTex ("Sprite Normals", 2D) = "bump" {} _Ramp ("Shading Ramp", 2D) = "white" {} _Color ("Tint", Color) = (1,1,1,1) [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0 _Cutoff ("Alpha Cutoff", Range (0,1)) = 0.5 } SubShader { Tags { "Queue"="Transparent" "IgnoreProjector"="False" "RenderType"="Transparent" "PreviewType"="Plane" "CanUseSpriteAtlas"="True" } Cull Off Lighting On ZWrite Off Fog { Mode Off } Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma surface surf CustomLambert alpha vertex:vert addshadow alphatest:_Cutoff #pragma multi_compile DUMMY PIXELSNAP_ON sampler2D _MainTex; sampler2D _NormalsTex; sampler2D _Ramp; fixed4 _Color; struct Input { float2 uv_MainTex; fixed4 color; }; half4 LightingCustomLambert (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten) { half NdotL = dot (s.Normal, lightDir); half4 c; c.rgb = (s.Albedo * _LightColor0.rgb * (tex2D (_Ramp, half2 (NdotL * 0.5 + 0.5, 0)))) * (atten * 2); c.a = s.Alpha; return c; } void vert (inout appdata_full v, out Input o) { #if defined(PIXELSNAP_ON) && !defined(SHADER_API_FLASH) v.vertex = UnityPixelSnap (v.vertex); #endif v.normal = float3(0,0,-1); v.tangent = float4(-1, 0, 0, 1); UNITY_INITIALIZE_OUTPUT(Input, o); o.color = _Color * v.color; } void surf (Input IN, inout SurfaceOutput o) { fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * IN.color; o.Albedo = c.rgb; o.Normal = UnpackNormal (tex2D (_NormalsTex, IN.uv_MainTex)); o.Alpha = c.a; } ENDCG } FallBack "Diffuse" }Shader须要的法线贴图能够通过一个软件:PixPlant生成出来,仅仅需提供原素材图。这个软件就能生成一个法线贴图了。
此外还须要一张阴影梯度图: