Unity shader glsl着色器特效之 模拟海面海浪效果
一个简单的海浪效果,通过波的叠加实现水面起伏的动效,根据波峰斜率来为浪花着色,再根据法线贴图和水花贴图来和调整uv的平滑移动来增强海浪移动的细节。如果需要更逼真的效果可以考虑在满足浪花触发的地方添加粒子系统
前置效果图
因为是很久以前写的文章,贴图已经找不到了,随便PS了两张看看效果
inspector的可调项目
原理介绍
水波部分使用4个不同参数的Gerstner波叠加,不同波长(10m/5m/3m/7m)不同传播方向(0°/45°/90°/135°),动态计算顶点偏移量:
offset += GerstnerWave(10.0, 0.3, 1.2, 0.0, worldPos, tangent, binormal);
通过交叉计算切线/副切线生成基础法线,叠加噪声贴图增加细节:
float3 noiseNormal = UnpackNormal(tex2D(_NoiseTex, IN.uv_NoiseTex));
o.Normal = normalize(noiseNormal + o.Normal);
水花效果实现,基于表面坡度检测生成水花:
float slope = 1 - o.Normal.y;
float foam = saturate(slope * 5 - 0.7) * foamTex.r;
光源反馈采用菲涅尔反射效果:
float fresnel = pow(1.0 - saturate(dot(o.Normal, IN.viewDir)), 4);
动态镜面反射:
o.Smoothness = _Gloss * (1 - foam);
完整代码
Shader "Custom/OceanWave" {Properties {_MainColor ("Main Color", Color) = (0.1, 0.3, 0.6, 1)_FoamColor ("Foam Color", Color) = (1,1,1,1)_WaveScale ("Wave Scale", Range(0,2)) = 0.5_WaveSpeed ("Wave Speed", Range(0,5)) = 1.2_NoiseTex ("Noise Texture", 2D) = "white" {}_FoamTex ("Foam Texture", 2D) = "white" {}_Gloss ("Gloss", Range(0,1)) = 0.8_NoiseUVSpeed ("Noise UV Speed", Vector) = (0.1, 0.1, 0, 0) // 添加噪声纹理UV移动速度_FoamUVSpeed ("Foam UV Speed", Vector) = (0.1, 0.1, 0, 0) // 添加水花纹理UV移动速度}SubShader {Tags { "RenderType"="Opaque" }LOD 200CGPROGRAM#pragma surface surf Standard vertex:vert addshadow#pragma target 3.0#include "UnityCG.cginc"struct Input {float3 worldPos;float3 viewDir;float2 uv_NoiseTex;float2 uv_FoamTex;};// 属性声明fixed4 _MainColor;fixed4 _FoamColor;sampler2D _NoiseTex;sampler2D _FoamTex;float _WaveScale;float _WaveSpeed;float _Gloss;float4 _NoiseUVSpeed;float4 _FoamUVSpeed;// Gerstner波函数float3 GerstnerWave(float wavelength,float amplitude,float speed,float direction,float3 position,inout float3 tangent,inout float3 binormal) {float k = 2 * UNITY_PI / wavelength;float c = sqrt(9.8 / k);float2 d = float2(sin(direction), cos(direction));float f = k * (dot(d, position.xz) - c * speed * _Time.y);float a = amplitude / k;tangent += float3(-d.x * d.x * (amplitude * sin(f)),d.x * (amplitude * cos(f)),-d.x * d.y * (amplitude * sin(f)));binormal += float3(-d.x * d.y * (amplitude * sin(f)),d.y * (amplitude * cos(f)),-d.y * d.y * (amplitude * sin(f)));return float3(d.x * (a * cos(f)),a * sin(f),d.y * (a * cos(f)));}// 顶点着色器void vert(inout appdata_full v, out Input o) {UNITY_INITIALIZE_OUTPUT(Input, o);float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;float3 tangent = float3(1,0,0);float3 binormal = float3(0,0,1);float3 offset = 0;// 叠加四个不同参数的波浪offset += GerstnerWave(10.0, 0.3, 1.2, 0.0, worldPos, tangent, binormal);offset += GerstnerWave(5.0, 0.2, 1.5, 0.785, worldPos, tangent, binormal);offset += GerstnerWave(3.0, 0.1, 2.0, 1.570, worldPos, tangent, binormal);offset += GerstnerWave(7.0, 0.15, 1.0, 2.356, worldPos, tangent, binormal);// 计算法线float3 normal = normalize(cross(binormal, tangent));v.normal = mul((float3x3)unity_WorldToObject, normal);worldPos += offset;v.vertex.xyz = mul(unity_WorldToObject, float4(worldPos, 1)).xyz;}// 表面着色器void surf (Input IN, inout SurfaceOutputStandard o) {// 计算UV偏移float2 noiseUVOffset = _NoiseUVSpeed.xy * _Time.y;float2 foamUVOffset = _FoamUVSpeed.xy * _Time.y;// 应用UV偏移float2 noisyUV = IN.uv_NoiseTex + noiseUVOffset;float2 foamUV = IN.uv_FoamTex + foamUVOffset;// 基础颜色fixed4 mainColor = _MainColor;// 法线计算float3 noiseNormal = UnpackNormal(tex2D(_NoiseTex, noisyUV));o.Normal = normalize(noiseNormal + o.Normal);// 水花效果float slope = 1 - o.Normal.y;fixed4 foamTex = tex2D(_FoamTex, foamUV);float foam = saturate(slope * 5 - 0.7) * foamTex.r;// 菲涅尔反射float fresnel = pow(1.0 - saturate(dot(o.Normal, IN.viewDir)), 4);// 最终颜色合成o.Albedo = lerp(mainColor.rgb, _FoamColor.rgb, foam);o.Metallic = 0.0;o.Smoothness = _Gloss * (1 - foam);o.Alpha = mainColor.a;}ENDCG}FallBack "Diffuse"
}
相关文章:

Unity shader glsl着色器特效之 模拟海面海浪效果
一个简单的海浪效果,通过波的叠加实现水面起伏的动效,根据波峰斜率来为浪花着色,再根据法线贴图和水花贴图来和调整uv的平滑移动来增强海浪移动的细节。如果需要更逼真的效果可以考虑在满足浪花触发的地方添加粒子系统 前置效果图 因为是很久…...

`AdminAdminDTO` 和 `userSession` 对象中的字段对应起来的表格
以下是将更正后的表格放在最前面的回答,表格包含序号列,合并了后端 AdminAdminDTO 和前端 userSession 的所有字段,并标注对方没有的字段。token 字段值用省略号(...)表示: 序号字段名AdminAdminDTO (后端…...
sqlserver查询内存使用情况的方法
查询 这个SQL查询用于获取当前数据库实例中各个数据库在缓冲池(buffer pool)中的数据页所占用的内存大小。 select isnull(db_name(database_id),ResourceDb) AS DatabaseName,CAST(COUNT(row_count) * 8.0 /(1024.0) AS DECIMAL(28,2)) AS [size (MB…...
rust笔记7-生命周期显式标注
Rust 的生命周期(Lifetimes)是 Rust 内存安全模型的核心部分,用于确保引用始终有效,避免悬垂引用(Dangling References)。下面我们从生命周期的设计出发点、标注语法以及在不同上下文中的应用(函数、方法、结构体、trait 等)来详细介绍。 1. 生命周期设计的出发点 Rus…...

SQL Server 导入Excel数据
1、选中指定要导入到哪个数据库,右键选择 》任务 》导入数据 2、数据源 选择Excel,点击 下一步(Next) 3、目前 选择OLE DB Provider ,点击 下一步(Next) 4、默认 ,点击 下一步(Next)…...

【笔记】LLM|Ubuntu22服务器极简本地部署DeepSeek+联网使用方式
2025/02/18说明:2月18日~2月20日是2024年度博客之星投票时间,走过路过可以帮忙点点投票吗?我想要前一百的实体证书,经过我严密的计算只要再拿到60票就稳了。一人可能会有多票,Thanks♪(・ω・)&am…...
【面试题】2025.02.19-前端面试题汇总
杭州三汇 1. 自我介绍 2. 你们前端项目为什么要用微前端? 减少由于程序更新导致的问题影响面积;缩小前端包体积,加快页面开发速度;便于统一多家医院某几个系统的程序一直; 3. 详细介绍一个项目,项目干什…...

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)
小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025) 本文内容需要你有一定的 Linux 操作基础,最好是程序员那种,英文水平足够用才行。一般人不需要使用这么复杂的路由器操作系统,…...

火语言RPA--Excel插入空行
【组件功能】:在Excel内指定的位置插入空行 配置预览 配置说明 在第n行之前 支持T或# 填写添加插入第n行之前行号。 插入n行 支持T或# 插入多少行。 Sheet页名称 支持T或# Excel表格工作簿名称。 示例 Excel插入空行 描述 在第3行之后插入3行。 配置 输…...

具有整合各亚专科医学领域知识能力的AI智能体开发纲要(2025版)
整合各亚专科医学领域知识能力的AI代理的开发与研究 一、引言 1.1 研究背景 在科技飞速发展的当下,人工智能(AI)已成为推动各行业变革的关键力量,医疗领域也不例外。近年来,AI 在医疗行业的应用取得了显著进展,从医学影像诊断到疾病预测,从药物研发到个性化医疗,AI 技…...

【Java 优选算法】位运算
欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 基础位运算符: &: 有 0 就是 0 | : 有 1 就是 1 ^ :相同为0,相异为1(无进位相加) 1.给一个数 n, 确定它的二进制表示中的第x位是 0 还是 1 . 使用公式(n >> x) &…...
细分数字货币钱包的不同种类
文章目录 一、中心化钱包1.1 中心化钱包架构1.2 中心化钱包业务细节流程 二、去中心化钱包(HD 钱包)2.1 去中心化钱包架构2.2 去中心化钱包细节业务流程 三、硬件钱包3.1 硬件钱包架构3.2 硬件钱包细节业务流程 四、MPC 托管钱包五、多签钱包 中心化钱包 :钱包私钥一…...
Nginx Embedded Variables 嵌入式变量解析(4)
Nginx Embedded Variables 嵌入式变量解析(4) 相关链接 nginx 嵌入式变量解析目录nginx 嵌入式变量全目录nginx 指令模块目录nginx 指令全目录 一、目录 1.1 变量目录 1.1.24 ngx_stream_core_module $binary_remote_addr $bytes_received $bytes_sent $connection $hos…...

ARM64 Trust Firmware [四]
完成第二阶段 BL2 的操作后就加载并进入 BL31,BL31 位于 DRAM 中,EL3 模式。除了做架构初始化和平台初始化外,还做了如下工作: 基本硬件初始化,比如 GIC,串口,timer 等;PSCI 服务的…...

SQLMesh 系列教程6- 详解 Python 模型
本文将介绍 SQLMesh 的 Python 模型,探讨其定义、优势及在企业业务场景中的应用。SQLMesh 不仅支持 SQL 模型,还允许通过 Python 编写数据模型,提供更高的灵活性和可编程性。我们将通过一个电商平台的实例,展示如何使用 Python 模…...

聊一聊vue如何实现角色权限的控制的
大家好,我是G探险者。 关于角色与权限控制,通常是分为两大类:一种是菜单权限;一种是操作权限。 菜单权限是指,每个角色对应着可以看到哪些菜单,至于每个菜单里面的每个按钮,比如增删改查等等这类…...
Python连接MySQL数据库图文教程,Python连接数据库MySQL入门教程
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1. 环境准备1.1安装 Python1.2选择开发环境1.3安装 MySQL 数据库1.4 安装 pymysql 库 2. 连接数据库3. 数据库基本操作3.1 创建数据库3.2 创建表3.3 插入数据3.…...

懒人精灵本地离线卡密验证系统教程(不联网、安全稳定、省钱、永久免费、无任何限制)
1.合集懒人精灵本地离线卡密验证系统教程(不联网、安全稳定、省钱、永久免费、无任何限制):https://www.bilibili.com/video/BV1M6rdYEEog/ 备注: 1.本地离线卡密采用最安全的非对称加解密技术,设备id采用最安全多重混合加密不可逆技术生成&…...

天 锐 蓝盾终端安全管理系统:办公U盘拷贝使用管控限制
天 锐 蓝盾终端安全管理系统以终端安全为基石,深度融合安全、管理与维护三大要素,通过对桌面终端系统的精准把控,助力企业用户构筑起更为安全、稳固且可靠的网络运行环境。它实现了管理的标准化,有效破解终端安全管理难题…...
LeetCode 2595.奇偶位数:位运算
【LetMeFly】2595.奇偶位数:位运算 力扣题目链接:https://leetcode.cn/problems/number-of-even-and-odd-bits/ 给你一个 正 整数 n 。 用 even 表示在 n 的二进制形式(下标从 0 开始)中值为 1 的偶数下标的个数。 用 odd 表示…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...