zoukankan      html  css  js  c++  java
  • 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生成出来,仅仅需提供原素材图。这个软件就能生成一个法线贴图了。

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


  • 相关阅读:
    android view生命周期
    ViewPager 滑动页(四)
    android 中如何获取camera当前状态
    Android LayoutInflater原理分析,带你一步步深入了解View(一)
    仿Twitter登陆移动背景效果
    Android应用性能优化之使用SQLiteStatement优化SQLite操作
    GreenDao官方文档翻译(下)
    高级IO
    linux信号
    LINUX进程
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5088428.html
Copyright © 2011-2022 走看看