[实例] Unity Shader 利用顶点着色器模拟简单水波

2024-05-03 10:04

本文主要是介绍[实例] Unity Shader 利用顶点着色器模拟简单水波,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们都知道顶点着色器可以用来改变模型各个顶点的位置,那么本篇我们就利用顶点着色器来做一个模拟简单水波的应用。

1. 简谐运动

在进行模拟水波之前,我们需要了解简谐运动(Simple Harmonic Motion)公式:

x(t) = Asin(\omega t+\phi )

 其中,x(t)是物体在时刻 t 的位移。A是振幅,表示物体离开平衡位置的最大距离。\omega是角频率,表示单位时间内物体转过的角度。t是时间,表示从某个参考点开始经过的时间,可以理解为频率。\phi是初相位,表示 t=0 时物体的初始位置与平衡位置的相位差。

在物理学中,简谐运动是一种理想化的运动模型,许多实际的振动系统(如弹簧振子、单摆等)在近似条件下都可以看作是简谐运动。我们可以利用简谐运动的公式来模拟简单水波的运动。

2. 实现横波与纵波

我们首先在Properties语义块中定义三个可调参数:

_Range("振幅", range(0, 1)) = 0.1
_Hz("频率", range(0.1, 2)) = 1
_Speed("速度", range(1, 5)) = 1

然后我们直接在代码里套用公式:

v2f vert(a2v appData)
{// 简谐运动计算appData.vertex.y += _Range * sin(appData.vertex.x * _Hz + _Time.y * _Speed);v2f outData;outData.pos = UnityObjectToClipPos(appData.vertex);outData.color = fixed4(appData.vertex.y, appData.vertex.y, appData.vertex.y, 1);return outData;
}

运行效果如下:

我们发现平面就会进行类似横波的运动,如果我们在公式里将appData.vertex的x改成z:

appData.vertex.y += _Range * sin(appData.vertex.z * _Hz + _Time.y * _Speed);

则平面就会进行纵波运动。

倘若我们将这两个公式计算全都加上,则会呈现如下效果:

3. 实现环形波

现在我们要实现一个以平面中心为起点向外扩散的环形波,只需把顶点与中心点之间的距离带入计算即可:

appData.vertex.y += _Range * sin(-length(appData.vertex.xz) * _Hz + _Time.y * _Speed);

实现效果如下:

4. 模拟简单水波

最后,我们运用两个简谐运动公式的叠加来模拟一个简单的水波效果:

appData.vertex.y += _Range * sin((appData.vertex.x + appData.vertex.z) * _Hz + _Time.y * _Speed);
appData.vertex.y += _Range * 1.5f * sin((appData.vertex.x - appData.vertex.z) * _Hz + _Time.w * _Speed);

简单地配置一下参数:

运行效果如下:

这篇关于[实例] Unity Shader 利用顶点着色器模拟简单水波的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956474

相关文章

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

java String.join()方法实例详解

《javaString.join()方法实例详解》String.join()是Java提供的一个实用方法,用于将多个字符串按照指定的分隔符连接成一个字符串,这一方法是Java8中引入的,极大地简化了... 目录bVARxMJava String.join() 方法详解1. 方法定义2. 基本用法2.1 拼接

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、