Unity2D实现贴图凹凸感并接受实时光照效果

来源:互联网 发布:电视播放软件破解版 编辑:程序博客网 时间:2024/05/01 04:19

先看最终效果:


我们的原图是一个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生成出来,只需提供原素材图,这个软件就能生成一个法线贴图了。

此外还需要一张阴影梯度图:


0 0
原创粉丝点击