您的位置:首页 > 移动开发 > Unity3D

水面波纹.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 shader 水面波纹