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

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


  • 相关阅读:
    HDU2473 Junk-Mail Filter 【可删除的并查集】
    NOI2001 食物链【扩展域并查集】*
    POJ1733 Parity game 【扩展域并查集】*
    Codeforces 9D How many trees? 【计数类DP】
    Codeforces 28C Bath Queue 【计数类DP】*
    Codeforces 280C Game on tree【概率DP】
    Codeforces 914H Ember and Storm's Tree Game 【DP】*
    Codeforces 1027E Inverse Coloring 【DP】
    BZOJ3673 可持久化并查集 by zky 【主席树】
    BZOJ4561 JLoi2016 圆的异或并 【扫描线】【set】*
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5088428.html
Copyright © 2020-2023  润新知