Unity Shader——Shader实现大海的波涛效果

Posted 御雪妃舞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity Shader——Shader实现大海的波涛效果相关的知识,希望对你有一定的参考价值。

本篇参考书《Unity Shaders and Effects CookBook》,先实现书上的效果,然后再做处理。


1.书中的波浪效果及原理


首先上效果图:


然后上脚本:
Shader "MyShaders/VertexAnimation" 

	Properties 
	
		_MainTex ("Base (RGB)", 2D) = "white" 
		_tintAmount ("Tint Amount", Range(0,1)) = 0.5
		_ColorA ("Color A", Color) = (1,1,1,1)
		_ColorB ("Color B", Color) = (1,1,1,1)
		_Speed ("Wave Speed", Range(0.1, 80)) = 5
		_Frequency ("Wave Frequency", Range(0, 5)) = 2
		_Amplitude ("Wave Amplitude", Range(-1, 1)) = 1
	
	
	SubShader 
	
		Tags  "RenderType"="Opaque" 
		LOD 200
		
		CGPROGRAM
		#pragma surface surf Lambert vertex:vert

		sampler2D _MainTex;
		float4 _ColorA;
		float4 _ColorB;
		float _tintAmount;
		float _Speed;
		float _Frequency;
		float _Amplitude;
		float _OffsetVal;

		struct Input 
		
			float2 uv_MainTex;
			float3 vertColor;
		;
		
		void vert(inout appdata_full v, out Input o)
		
			UNITY_INITIALIZE_OUTPUT(Input, o);

			float time = _Time * _Speed;
			float waveValueA = sin(time + v.vertex.x * _Frequency) * _Amplitude;
			
			v.vertex.xyz = float3(v.vertex.x, v.vertex.y + waveValueA, v.vertex.z);
			v.normal = normalize(float3(v.normal.x + waveValueA, v.normal.y, v.normal.z));
			o.vertColor = float3(waveValueA,waveValueA,waveValueA);
		

		void surf (Input IN, inout SurfaceOutput o) 
		
			half4 c = tex2D (_MainTex, IN.uv_MainTex);
			float3 tintColor = lerp(_ColorA, _ColorB, IN.vertColor).rgb; 
			
			o.Albedo = c.rgb * (tintColor * _tintAmount);
			o.Alpha = c.a;
		
		ENDCG
	 
	FallBack "Diffuse"


分析下: 核心是这一个函数
首先这个是根据时间来控制变动的,函数原型就是sin(m+ax)*h,具体分析如下:




下面代码表示它沿x轴位移,在y轴上拨动。

2.模拟大海的波涛

书中值是模拟沿x轴的波浪,我们再加上z轴的波浪,不就是模仿了大海的效果吗?于是改动主要函数如图:


效果图如下:


如果你觉得太规律了,可以再细化,让每个波谷不一样大小,设计个随机数在里面就好了,祝你好运!

以上是关于Unity Shader——Shader实现大海的波涛效果的主要内容,如果未能解决你的问题,请参考以下文章

TA养成之路unity·shader(一)

Unity2017程序化天空Shader实现

Unity Shader 纹理映射的实现

Unity 之 后处理实现界面灰度效果(PostProcessing实现 | Shader实现)

Unity Shader入门☀️ | 使用Shader实现一个彩虹球效果✨!闪闪发光的特效离我又近了一步!

Unity Shader入门☀️ | 使用Shader实现一个 图片边框 ✨制作!