[实例] 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

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如