本篇参考书《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 200CGPROGRAM#pragma surface surf Lambert vertex:vertsampler2D _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轴的波浪,不就是模仿了大海的效果吗?于是改动主要函数如图:效果图如下:
如果你觉得太规律了,可以再细化,让每个波谷不一样大小,设计个随机数在里面就好了,祝你好运!