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 并把 刚才新建的 材质球 赋予

请添加图片描述

基本参数调节

请添加图片描述

所需图片

↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓ 图片 ↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓

请添加图片描述

↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑ 图片 ↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑
↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓ 图片 ↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓

请添加图片描述

↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑ 图片 ↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑

请添加图片描述

请添加图片描述

↡↡↡↡↡↡↡↡↡↡ ↡↡↡↡↡↡↡↡↡↡ 下面有一张图片 ↡↡↡↡↡↡↡↡↡↡ ↡↡↡↡↡↡↡↡↡↡

请添加图片描述

↟↟↟↟↟↟↟↟↟↟ ↟↟↟↟↟↟↟↟↟↟ 上面有一张图片 ↟↟↟↟↟↟↟↟↟↟ ↟↟↟↟↟↟↟↟↟↟

请添加图片描述

效果呈现

不同角度 展示不同效果

请添加图片描述

请添加图片描述
暂时先这样吧,如果有时间的话就会更新,实在看不明白就留言,看到我会回复的。
路漫漫其修远兮,与君共勉。

猜你喜欢

转载自blog.csdn.net/weixin_43925843/article/details/122177137