unity中使用shader实现流光效果

发表于2017-04-20
评论3 4.8k浏览
  流光效果为什么很多项目会使用到,从画法的角度看,流光效果的成本很低,一张流光图,一张过滤图,一个渲染遍,即可实现效果,而且做出来后的特别受欢迎。下面就给大家介绍下使用shader制作流光效果。
  1、通过一些简单效果可以让我们更好的去理解shader,具体都在代码注释中;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Shader "Unlit/MoveLightImage" 
    Properties 
    
        //主纹理 
        _MainTex ("Texture", 2D) = "white" {} 
        //灯光纹理 
        _LightTex("Light Texture",2D)="white"{} 
        //遮罩纹理 
        _MaskTex("Mask Texture",2D)="white"{} 
    
    SubShader 
    
        Tags {"Queue"="Transparent" "RenderType"="Transparent"
        LOD 100 
        //透明混合 
        Blend SrcAlpha OneMinusSrcAlpha 
   
        Pass 
        
            CGPROGRAM 
            #pragma vertex vert 
            #pragma fragment frag 
            // make fog work 
            #pragma multi_compile_fog 
              
            #include "UnityCG.cginc" 
   
            struct appdata 
            
                float4 vertex : POSITION; 
                float2 uv : TEXCOORD0; 
            }; 
   
            struct v2f 
            
                float2 uv : TEXCOORD0; 
                UNITY_FOG_COORDS(1) 
                float4 vertex : SV_POSITION; 
            }; 
   
            sampler2D _MainTex; 
            float4 _MainTex_ST; 
            sampler2D _LightTex; 
            sampler2D _MaskTex; 
            fixed4 _Color; 
   
            v2f vert (appdata v) 
            
                v2f o; 
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); 
                o.uv = TRANSFORM_TEX(v.uv, _MainTex); 
                UNITY_TRANSFER_FOG(o,o.vertex); 
                return o; 
            
               
            fixed4 frag (v2f i) : SV_Target 
            
                //灯光贴图 取一半UV 
                float2 uv=i.uv*0.5; 
                //不断改变uv的x轴,让他往x轴方向移动,_Time为shader的时间函数,会一直执行 
                uv.x+=-_Time.y*0.4; 
                //取灯光贴图的alpha值,黑色为0,白色为1  
                fixed lightTexA=tex2D(_LightTex,uv).a; 
                //获取遮罩贴图的alpha值,黑色为0,白色为1 这里的uv和上面的uv是调用的不一样的函数 
                fixed maskA=tex2D(_MaskTex,i.uv).a; 
   
                //主纹理+灯光贴图*遮罩贴图 简单原理任何数*0为0   这样就避免了遮罩外出现不协调灯光贴图 
                fixed4 col = tex2D(_MainTex, i.uv)+lightTexA*maskA*0.6; 
                // apply fog 
                UNITY_APPLY_FOG(i.fogCoord, col);               
                return col; 
            
            ENDCG 
        
    
}
  2.材质参数;
  3.效果展示

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论