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軸的波浪,不就是模仿了大海的效果嗎?於是改動主要函數如圖:



效果圖如下:



如果你覺得太規律了,可以再細化,讓每個波谷不一樣大小,設計個隨機數在裏面就好了,祝你好運!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章