水面波纹.shader
2016-05-11 18:53
435 查看
1、上面的水面波纹效果是从一个大神代码里面扣出来的。
为了看算法,尽量减少变量,只实现效果,减去了 Alpha 值随 Y 值变化效果
里面有很多数据可以写成变量,便于调整效果,为了方便查看关键代码,尽量减少可变属性。关键代码已有片段编辑中的一行,已经写了很长的注释
Shader "Custom/RippleShaderMy" { Properties { _Color("Base Color", Color) = (1,1,1,1) _MainTex("Base(RGB)", 2D) = "white" {} _DecorativeTex("DecorativeTex (RGB)", 2D) = "white"{} } SubShader { tags{"Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "True"} Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" float4 _Color; sampler2D _MainTex; sampler2D _DecorativeTex; struct v2f { float4 pos:POSITION; float4 uv:TEXCOORD0; }; struct appdata{ float4 vertex : POSITION; float4 texcoord : TEXCOORD; }; v2f vert(appdata v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord; return o; } half4 frag(v2f i):COLOR { /*因为需要一种扭曲效果,因此图片的边缘肯定不能是顺滑的, 但是也不能用随机数来决定边缘的偏移左边,因为可能不是连续的,可能会出现锯齿, 因此需要从图片中找出一个属性是平滑的改变的,图片的rgb值就是这样的,因此这里使用gb值。 至于为什么要获得噪波贴图的x坐标轴的下一个像素和y轴坐标的下一个像素的gb值,然后减去1,可能是因为比较接近渐变值。。 其实只取x或者y轴坐标的下一个也可以 例如这样:float2 c = tex2D(_DecorativeTex, i.uv.xy + float2(0, _Time.x)).gb;*/ float2 c = (tex2D(_DecorativeTex, i.uv.xy + float2(0, _Time.x )).gb + tex2D(_DecorativeTex, i.uv.xy + float2(_Time.x , 0)).gb ) - 1 ; /*后面x的0.1其实可以做成变量控制扭曲效果的程度*/ float2 ruv = float2(i.uv.x, i.uv.y) + c.xy * 0.1; half4 h = tex2D(_MainTex, ruv); return h; } ENDCG } } }
2、大神的水面波纹代码
Shader "Custom/RippleShader" { Properties { // _Color("Base Color", Color) = (1,1,1,1) _MainTex("Base(RGB)", 2D) = "white" {} _NoiseTex ("Wave Noise", 2D) = "white" {}//噪波贴图 _Color ("Tint", Color) = (1,1,1,1) _Indentity ("Indentity", float) = 0.1//表示水波的扭曲强度 _SpeedX ("WaveSpeedX", float) = 0.08//噪波贴图延X方向的移动速度 _SpeedY ("WaveSpeedY", float) = 0.04//噪波贴图延Y方向的移动速度 _AlphaFadeIn ("AlphaFadeIn", float) = 0.0//水波的淡入位置 _AlphaFadeOut ("AlphaFadeOut", float) = 1.0//水波的淡出位置 _TwistFadeIn ("TwistFadeIn", float) = 1.0//扭曲的淡入位置 _TwistFadeOut ("TwistFadeOut", float) = 1.01//扭曲的淡出位置 _TwistFadeInIndentity ("TwistFadeInIndentity", float) = 1.0//扭曲的淡入强度 _TwistFadeOutIndentity ("TwistFadeOutIndentity", float) = 1.0//扭曲的淡出强度 } SubShader { tags{"Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "True"} Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" // float4 _Color; sampler2D _MainTex; sampler2D _NoiseTex; fixed4 _Color; half _Indentity; half _SpeedX; half _SpeedY; float _AlphaFadeIn; float _AlphaFadeOut; half _TwistFadeIn; half _TwistFadeOut; fixed _TwistFadeInIndentity; fixed _TwistFadeOutIndentity; struct v2f { float4 pos:POSITION; float4 uv:TEXCOORD0; float4 color:COLOR; }; struct appdata{ float4 vertex : POSITION; float4 texcoord : TEXCOORD; float4 color : COLOR; }; v2f vert(appdata v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord; o.color = v.color; return o; } half4 frag(v2f i):COLOR { //对淡入强度和淡出强度的插值 fixed fadeT = saturate((_TwistFadeOut - i.uv.y) / (_TwistFadeOut - _TwistFadeIn)); float2 tuv = (i.uv - float2(0.5, 0)) * fixed2(lerp(_TwistFadeOutIndentity, _TwistFadeInIndentity, fadeT), 1) + float2(0.5, 0); //计算噪波贴图的RG值,得到扭曲UV, float2 waveOffset = (tex2D(_NoiseTex, i.uv.xy + float2(0, _Time.y * _SpeedY)).rg + tex2D(_NoiseTex, i.uv.xy + float2(_Time.y * _SpeedX, 0)).rg) - 1; float2 ruv = float2(i.uv.x, 1 - i.uv.y) + waveOffset * _Indentity; //使用扭曲UV对纹理采样 float4 c = tex2D (_MainTex, ruv); //对淡入Alpha和淡出Alpha的插值 fixed fadeA = saturate((_AlphaFadeOut - ruv.y) / (_AlphaFadeOut - _AlphaFadeIn)); c = c * _Color * i.color * fadeA; clip (c.a - 0.01); return c; } ENDCG } } }
相关文章推荐
- unity实现多点触控代码
- 在Unity中实现动画的正反播放代码
- Unity UGUI教程之实现滑页效果
- unity实现摄像头跟随
- Unity3D上路_01-2D太空射击游戏
- Unity3D上路_02-第一视角射击游戏
- Unity3D上路_03-塔防游戏
- Unity3D上路_04-基础资源介绍
- Unity3D上路_05-网络相关
- [软件资讯]Unity已支持将3D游戏导出成Flash
- ShaderLab: Pass
- Unity 武器拖尾效果
- unity常见问题之20题
- 反编译ARB program to GLSL shader日记
- Unity3D动画存储插件
- unity 赛车相机跟随物体移动
- uLua中遇到的问题
- Unity3d 协程、调用函数、委托
- Unity3d摄像机Camera参数详解
- Unity3d多线程