【OpenGL】Shader实例分析(六)- 卡牌特效

来源:互联网 发布:cf端游刷枪软件安卓版 编辑:程序博客网 时间:2024/04/29 16:36

转发请保持地址:http://blog.csdn.net/stalendp/article/details/30989295

本文将介绍怎么通过alpha通道来隐藏信息,并实现卡牌特效。运行效果如下:


代码如下:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. Shader "stalendp/imageShine" {  
  2.     Properties {  
  3.         _MainTex ("image", 2D) = "white" {}  
  4.         _NoiseTex("noise", 2D) = "bump" {}  
  5.         _percent("percent", Range(-0.3, 1)) = 0  
  6.         _DefColor ("defalutColor", COLOR)  = ( 0, .8, .4, 1)  
  7.     }  
  8.       
  9.     CGINCLUDE  
  10.         #include "UnityCG.cginc"             
  11.         
  12.         sampler2D _MainTex;  
  13.         sampler2D _NoiseTex;          
  14.         float _percent;  
  15.         fixed4 _DefColor;  
  16.           
  17.         struct v2f {      
  18.             half4 pos:SV_POSITION;      
  19.             half4 uv : TEXCOORD0;     
  20.         };    
  21.     
  22.         v2f vert(appdata_full v) {    
  23.             v2f o;    
  24.             o.pos = mul (UNITY_MATRIX_MVP, v.vertex);    
  25.             o.uv.xy = v.texcoord.xy;  
  26.             o.uv.zw = v.texcoord.xy + _Time.xx ;  
  27.             return o;    
  28.         }    
  29.     
  30.         fixed4 frag(v2f i) : COLOR0 {  
  31.             // 原始卡牌, 把alpha设置为1,屏蔽掉alpha通道信息  
  32.             fixed4 tex0 = tex2D(_MainTex, i.uv.xy);  
  33.             tex0.a = 1;  
  34.             // 透明躁动卡牌; 使用alpha通道信息,设置显示颜色,并加入躁动;  
  35.             half3 noise = tex2D(_NoiseTex, i.uv.zw );  
  36.             fixed4 tex1 = tex2D(_MainTex, i.uv.xy + noise.xy * 0.05 - 0.025);  
  37.             tex1.rgb = _DefColor.rgb;  
  38.               
  39.             return lerp(tex0, tex1, smoothstep(0, 0.3, i.uv.y-_percent));  
  40.         }    
  41.     ENDCG      
  42.     
  43.     SubShader {     
  44.         Tags {"Queue" = "Transparent"}       
  45.         ZWrite Off       
  46.         Blend SrcAlpha OneMinusSrcAlpha       
  47.         Pass {      
  48.             CGPROGRAM      
  49.             #pragma vertex vert      
  50.             #pragma fragment frag      
  51.             #pragma fragmentoption ARB_precision_hint_fastest       
  52.     
  53.             ENDCG      
  54.         }  
  55.     }  
  56.     FallBack Off    
  57. }  

素材准备:

1)在本例中,在photoshop中处理图片,在alpha通道中存放了如下的信息图:


然后导出图片成为 tif格式。

2)准备一张噪声图片,并在unity下转化为Normal Map类型(改成NormalMap,会有相应的参数可以调节,对于这里的shader可以省略)。如下图:


3)用Quad来测试当前shader。填写shader参数如下:


调节percent,就可以看到文章开头的那个特效。

原理解析:

1)透明躁动图片,这是在alpha图片的基础上加入躁动得到的结果。代码如下:
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. half3 noise = tex2D(_NoiseTex, i.uv.zw );  
  2. fixed4 tex1 = tex2D(_MainTex, i.uv.xy + noise.xy * 0.05 - 0.025);  
  3. tex1.rgb = _DefColor.rgb;  
图片扭曲过程的解释:
a)由于_NoiseTex所表示的噪声图片的每个像素点的值在区间[0,1]之内。即noise.xy的值在[0,1]之间。
b)  noise.xy * 0.05 的区间为[0,0.05];
c)noise.xy * 0.05-0.025的区间为[-0.025,0.025]
d)i.uv.xy + noise.xy * 0.05 - 0.025 表示对原来图片的uv进行[-0.025,0.025]之间任意值的一次偏移(取决于噪声图),这样就形成了图像扭曲效果。
e)又由于i.uv.zw受时间支配,所以noise的值也随时间变化。这样整个图片的扭曲,也随时间变化,就形成了液化的效果。
其中0.05和0.025的值是实验得出的。可以更具实际情况改变来达到不同的效果。

2)两个图片的叠加;通过比较uv中的v 和 _percent,来融合处理后的alpha通道和rgb通道。
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. lerp(tex0, tex1, smoothstep(0, 0.3, i.uv.y-_percent));  

延伸:

当然也可以只对图片的局部进行处理。比如下图对闪电的处理,把闪电信息存放到alpha通道,然后就可以在shader做相应的处理了:


本文主要介绍怎样利用图片的alpha通道来隐藏信息,可以节省资源。这样的运用会有很多,有机会以后多加介绍。
0 0
原创粉丝点击