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实现大海的波涛效果的主要内容,如果未能解决你的问题,请参考以下文章
Unity 之 后处理实现界面灰度效果(PostProcessing实现 | Shader实现)