Unity Shader学习笔记(四) 水气泡 Shader的实现

发表于2017-06-05
评论0 1.6k浏览

最近正在学习Shader,同时也在研究ShadowGun里面的一些渲染,其中有一个场景中有一个水气泡的效果感觉挺好,于是拿来学习一下。如图:

实现水气泡的原理很简单,需要2个层,然后通过图的UV动画来实现视觉效果。具体实现如下:

[csharp] view plain copy
  1. Shader "Custom/Scroll2LayersAditive-addtiveBlend" {  
  2.   
  3. Properties {  
  4.     _MainTex ("Base layer (RGB)", 2D) = "white" {}       //前层图  
  5.     _DetailTex ("2nd layer (RGB)", 2D) = "white" {}      //后层图  
  6.     _ScrollX ("Base layer Scroll speed X", Float) = 1.0  // 前层图X方向的速度  
  7.     _ScrollY ("Base layer Scroll speed Y", Float) = 0.0  // 前层图Y方向的速度  
  8.     _Scroll2X ("2nd layer Scroll speed X", Float) = 1.0  // 后层图X方向的速度  
  9.     _Scroll2Y ("2nd layer Scroll speed Y", Float) = 0.0  // 后层图Y方向的速度  
  10.     _AMultiplier ("Layer Multiplier", Float) = 0.5  
  11.     _TintColor("Tint color",Color) = (1,1,1,1)  
  12. }  
  13.   
  14. SubShader {  
  15.     Tags {"Queue"="Transparent" "RenderType"="Transparent" }  
  16.       
  17.     Blend One One  
  18.     ZWrite Off    
  19.     Lighting Off Fog { Mode Off }  
  20.       
  21.     LOD 100  
  22.       
  23.           
  24.     CGINCLUDE  
  25.     #pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON  
  26.     #include "UnityCG.cginc"  
  27.     sampler2D _MainTex;  
  28.     sampler2D _DetailTex;  
  29.   
  30.     float4 _MainTex_ST;  
  31.     float4 _DetailTex_ST;  
  32.       
  33.     float _ScrollX;  
  34.     float _ScrollY;  
  35.     float _Scroll2X;  
  36.     float _Scroll2Y;  
  37.     float _AMultiplier;  
  38.     float4 _TintColor;  
  39.       
  40.     struct v2f {  
  41.         float4 pos : SV_POSITION;  
  42.         float2 uv : TEXCOORD0;  
  43.         float2 uv2 : TEXCOORD1;  
  44.         fixed4 color : TEXCOORD2;         
  45.     };  
  46.   
  47.       
  48.     v2f vert (appdata_full v)  
  49.     {  
  50.         v2f o;  
  51.         o.pos = mul(UNITY_MATRIX_MVP, v.vertex);  
  52.         o.uv = TRANSFORM_TEX(v.texcoord.xy,_MainTex) + frac(float2(_ScrollX, _ScrollY) * _Time);  //frac    返回输入值的小数部分。  
  53.         o.uv2 = TRANSFORM_TEX(v.texcoord.xy,_DetailTex) + frac(float2(_Scroll2X, _Scroll2Y) * _Time);  
  54.         o.color = v.color * _TintColor * _TintColor.a;  
  55.         o.color.xyz *= _AMultiplier;  
  56.   
  57.         return o;  
  58.     }  
  59.     ENDCG  
  60.   
  61.   
  62.     Pass {  
  63.         CGPROGRAM  
  64.         #pragma vertex vert  
  65.         #pragma fragment frag  
  66.         #pragma fragmentoption ARB_precision_hint_fastest         
  67.         fixed4 frag (v2f i) : COLOR  
  68.         {  
  69.             fixed4 o;  
  70.             fixed4 tex = tex2D (_MainTex, i.uv);  
  71.             fixed4 tex2 = tex2D (_DetailTex, i.uv2);  
  72.               
  73.             o = (tex + tex2) * i.color;  
  74.               
  75.             return o;  
  76.         }  
  77.         ENDCG   
  78.     }     
  79. }  
  80. }  
水气泡的图片:


返回到Unity,新建一个材质球,把新写的Shader添加到此材质球上,然后在场景中新建一个Plane,把材质球拖拽到上面,设置如下:


运行一下,就可以出现水气泡的效果了.

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

0个评论