900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Unity Shader——Shader实现大海的波涛效果

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

时间:2024-03-10 03:31:29

相关推荐

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 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轴的波浪,不就是模仿了大海的效果吗?于是改动主要函数如图:

效果图如下:

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。