Unity UV 水效果实现
Unity Water Shader
Shader "Custom/SeaWave"
{
Properties{
_WaterTex("水纹理", 2D) = "black" {}
_WaveTex("海浪", 2D) = "black" {} //海浪
_BumpTex("碰撞纹理", 2D) = "bump" {}
_GTex("海水渐变", 2D) = "white" {} //海水渐变
_NoiseTex("海浪躁波", 2D) = "white" {} //海浪躁波
_WaterSpeed("海水速度", float) = 0.74 //海水速度
_WaveSpeed("海浪速度", float) = -12.64 //海浪速度
_WaveRange(" 波动范围", float) = 0.3
_NoiseRange("噪声幅度", float) = 6.43
_WaveDelta("深水波动", float) = 2.43
_Refract("折射", float) = 0.03
_Specular("反射", float) = 1.86
_Gloss("遮盖", float) = 0.71
_SpecColor("标准颜色", color) = (1, 1, 1, 1)
_Range("范围", vector) = (0.13, 1.53, 0.37, 0.78)
}
CGINCLUDE
fixed4 LightingWaterLight(SurfaceOutput s, fixed3 lightDir, half3 viewDir, fixed atten) {
half3 halfVector = normalize(lightDir + viewDir);
float diffFactor = max(0, dot(lightDir, s.Normal)) * 0.8 + 0.2;
float nh = max(0, dot(halfVector, s.Normal));
float spec = pow(nh, s.Specular * 128.0) * s.Gloss;
fixed4 c;
c.rgb = (s.Albedo * _LightColor0.rgb * diffFactor + _SpecColor.rgb * spec * _LightColor0.rgb) * (atten);
c.a = s.Alpha + spec * _SpecColor.a;
return c;
}
ENDCG
SubShader{
Tags { "RenderType" = "Transparent" "Queue" = "Transparent"}
LOD 200
GrabPass{}
zwrite off
CGPROGRAM
#pragma surface surf WaterLight vertex:vert alpha noshadow
#pragma target 3.0
sampler2D _GTex;
sampler2D _WaterTex;
sampler2D _BumpTex;
sampler2D _CameraDepthTexture;
sampler2D _GrabTexture;
half4 _GrabTexture_TexelSize;
sampler2D _NoiseTex;
sampler2D _WaveTex;
float4 _Range;
half _WaterSpeed;
half _WaveSpeed;
fixed _WaveDelta;
half _WaveRange;
fixed _Refract;
half _Specular;
fixed _Gloss;
half _NoiseRange;
float4 _WaterTex_TexelSize;
struct Input {
float2 uv_WaterTex;
float2 uv_NoiseTex;
float4 proj;
float3 viewDir;
};
void vert(inout appdata_full v, out Input i) {
UNITY_INITIALIZE_OUTPUT(Input, i);
i.proj = ComputeScreenPos(UnityObjectToClipPos(v.vertex));
COMPUTE_EYEDEPTH(i.proj.z);
}
void surf(Input IN, inout SurfaceOutput o) {
float2 uv = IN.proj.xy / IN.proj.w;
#if UNITY_UV_STARTS_AT_TOP
if (_WaterTex_TexelSize.y < 0)
uv.y = 1 - uv.y;
#endif
fixed4 water = (tex2D(_WaterTex, IN.uv_WaterTex + float2(_WaterSpeed*_Time.x,0)) + tex2D(_WaterTex, float2(1 - IN.uv_WaterTex.y,IN.uv_WaterTex.x) + float2(_WaterSpeed*_Time.x,0))) / 2;
float4 offsetColor = (tex2D(_BumpTex, IN.uv_WaterTex + float2(_WaterSpeed*_Time.x,0)) + tex2D(_BumpTex, float2(1 - IN.uv_WaterTex.y,IN.uv_WaterTex.x) + float2(_WaterSpeed*_Time.x,0))) / 2;
half2 offset = UnpackNormal(offsetColor).xy * _Refract;
half m_depth = LinearEyeDepth(tex2Dproj(_CameraDepthTexture, IN.proj).r);
half deltaDepth = m_depth - IN.proj.z;
fixed4 noiseColor = tex2D(_NoiseTex, IN.uv_NoiseTex);
half4 bott = tex2D(_GrabTexture, uv + offset);
fixed4 waterColor = tex2D(_GTex, float2(min(_Range.y, deltaDepth) / _Range.y,1));
fixed4 waveColor = tex2D(_WaveTex, float2(1 - min(_Range.z, deltaDepth) / _Range.z + _WaveRange * sin(_Time.x*_WaveSpeed + noiseColor.r*_NoiseRange),1) + offset);
waveColor.rgb *= (1 - (sin(_Time.x*_WaveSpeed + noiseColor.r*_NoiseRange) + 1) / 2)*noiseColor.r;
fixed4 waveColor2 = tex2D(_WaveTex, float2(1 - min(_Range.z, deltaDepth) / _Range.z + _WaveRange * sin(_Time.x*_WaveSpeed + _WaveDelta + noiseColor.r*_NoiseRange),1) + offset);
waveColor2.rgb *= (1 - (sin(_Time.x*_WaveSpeed + _WaveDelta + noiseColor.r*_NoiseRange) + 1) / 2)*noiseColor.r;
half water_A = 1 - min(_Range.z, deltaDepth) / _Range.z;
half water_B = min(_Range.w, deltaDepth) / _Range.w;
float4 bumpColor = (tex2D(_BumpTex, IN.uv_WaterTex + offset + float2(_WaterSpeed*_Time.x,0)) + tex2D(_BumpTex, float2(1 - IN.uv_WaterTex.y,IN.uv_WaterTex.x) + offset + float2(_WaterSpeed*_Time.x,0))) / 2;
o.Normal = UnpackNormal(bumpColor).xyz;
o.Specular = _Specular;
o.Gloss = _Gloss;
o.Albedo = bott.rgb * (1 - water_B) + waterColor.rgb * water_B;
o.Albedo = o.Albedo * (1 - water.a*water_A) + water.rgb * water.a*water_A;
o.Albedo += (waveColor.rgb + waveColor2.rgb) * water_A;
o.Alpha = min(_Range.x, deltaDepth) / _Range.x;
}
ENDCG
}
//FallBack "Diffuse"
}
组件搭载
在当前 Shader 上创建一个 Material 材质球
新建一个 Plane 并把 刚才新建的 材质球 赋予
基本参数调节
所需图片
↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓ 图片 ↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓
↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑ 图片 ↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑
↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓ 图片 ↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓
↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑ 图片 ↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑
↡↡↡↡↡↡↡↡↡↡ ↡↡↡↡↡↡↡↡↡↡ 下面有一张图片 ↡↡↡↡↡↡↡↡↡↡ ↡↡↡↡↡↡↡↡↡↡
↟↟↟↟↟↟↟↟↟↟ ↟↟↟↟↟↟↟↟↟↟ 上面有一张图片 ↟↟↟↟↟↟↟↟↟↟ ↟↟↟↟↟↟↟↟↟↟
效果呈现
不同角度 展示不同效果
暂时先这样吧,如果有时间的话就会更新,实在看不明白就留言,看到我会回复的。
路漫漫其修远兮,与君共勉。