游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2934|回复: 0

Unity特效设计教程:标题光效

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2019-1-22 15:49:16 | 显示全部楼层 |阅读模式
1.jpg

文/罗培羽

关联文章:

Unity特效设计教程:实现“梦幻旋屏”
Unity特效设计教程:图片的切割与翻转
Unity特效设计教程(四) :标题光效
Unity特效设计教程:滚动的背景

标题光效是一种常见的图片特效,“遮罩层”从左往右经过,起到强调游戏标题的作用,如下图所示。那么怎样用Shader实现这种效果呢?

2.png

1、编写Shader

下面的着色器代码使用了顶点/片元着色器处理标题光效功能。这里定义4个属性,其中_MainTex代表图片贴图,_MaskColor代表遮罩颜色,Speed代表光效的移动速度,_MaskLimit控制着光效的宽度。核心代码为“float isMask = sin(_Time.y*_Speed -i.uv.x*2*PI );”“isMask = step(_MaskLimit,isMask);”“c.rgb += _MaskColor*isMask;”这3句。如果isMask为1,代表该片元被遮罩,如果为0,表示不被遮罩,通过“c.rgb += _MaskColor*isMask;”便可计算片元的颜色。“float isMask = sin(_Time.y*_Speed -i.uv.x*2*PI );”将根据时间和uv的x坐标计算isMask,此时isMask的取值范围为[-1,1]。step(_MaskLimit,isMask)的功能相当于“if(isMask > MaskLimit) return 1; else return 0;”通过_MaskLimit将指定区间的值设为1,其他设为0。

Shader "Lpy/ImageEffect"
{
        Properties
        {
                _MainTex ("Main Tex", 2D) = "white" {}
                _MaskColor ("Mask Color", Color) = (1, 1, 1, 1)
               
                _Speed ("Speed", float) = 2
                _MaskLimit ("MaskLimit", float) = 0.8
        }
        
        SubShader
        {
                Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
               
                Pass
                {
                        Tags { "LightMode"="ForwardBase" }
                        ZTest off
                        ZWrite Off
                        Blend SrcAlpha OneMinusSrcAlpha
                        
                        CGPROGRAM
                        #pragma vertex vert  
                        #pragma fragment frag
                        #include "UnityCG.cginc"
                        #define PI 3.14159265358979  
                        
                        
                        sampler2D _MainTex;
                        fixed3 _MaskColor;
                        float _Speed;
                        float _MaskLimit;
                        
                        struct a2v
                        {  
                            float4 vertex : POSITION;
                            float3 texcoord : TEXCOORD0;
                        };  
                        
                        struct v2f
                        {  
                            float4 pos : SV_POSITION;
                            float2 uv : TEXCOORD0;
                        };  
                        
                        v2f vert (a2v v)
                        {  
                                v2f o;  
                                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);  
                                o.uv = v.texcoord;
                                return o;
                        }  
                        
                        fixed4 frag (v2f i) : SV_Target
                        {
                                fixed4 c = tex2D(_MainTex, i.uv);
                                
                                float isMask = sin(_Time.y*_Speed  -i.uv.x*2*PI );
                                isMask = step(_MaskLimit,isMask);
                                
                                c.rgb += _MaskColor*isMask;
                                return c;
                        }
                        ENDCG
                }  
        }
        FallBack "Transparent/VertexLit"
}

2、使用材质

新建一个名为ImageEffect的材质,选择上述编写的shader。设置MaskColor、Speed、MaskLimit这3个参数,如下图所示。

3.png

将刚创建的材质应用于图片上,即可看到效果。如下图所示。

4.png

最后依然到了广告时间:最后依然到了广告时间:

笔者在分享文章的同时也结识了一群兴趣相投的朋友,本周五将会作客游戏蛮牛,在线答疑。

【2.24 某知名游戏公司主程在线答疑 参与有机会得《Unity 3D网络游戏实战》】

专栏地址:https://zhuanlan.zhihu.com/p/25336817


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-4-27 09:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表