当前位置: 首页 > news >正文

水波效果

水波效果指在计算机图形学中模拟水面波纹的视觉效果,通常用于游戏、动画或者其他虚拟场景中。主要用于体现水体的动态感,比如水的波动、反射、折射、透明等,可以让人感觉像真实的水一样流动闪耀。

核心特点就是:

  • 动态波纹
  • 光学特性(反射、折射、菲涅耳效应)
  • 透明度

1、基本原理

水波效果可以基于【带法线纹理的玻璃效果】进行修改,通过添加噪声法线纹理结合Shader内置时间变量实现水波动态效果,加入菲涅耳计算公式实现水面的光学特性

关键点:

  • 噪声纹理的使用

可以利用沃利噪声(细胞噪声)生成的噪声纹理灰度图,在Unity中将该噪声纹理灰度图作为高度图使用,用它代表水面的法线信息,只需要在Unity中将该灰度图设置为Normal map,并勾选Create from Grayscale后应用即可

  • 动态效果的实现

自定义两个属性,代表水平面x和y轴的速度。在片元着色器中利用Shader内置时间参数 _Time.y 得到累积速度变化。然后用该速度变量从噪声法线纹理中进行两次采样,再讲两次采样的结果相加得到扰动后的法线,最后用该法线处理折射、反射、菲涅耳效果,这样看起来就会有动态效果了
该算法是图形学前辈们总结的高效的模拟流动感的算法,水波、火焰、玻璃折射都可以用

  • 菲涅耳公式的运用

2、实现

Shader "ShaderProj/21/WaterWave"
{Properties{_MainTex("MainTex", 2D) = ""{}_BumpMap("BumpMap", 2D) = ""{}_Cube("Cubemap", Cube) = ""{}//控制折射扭曲程度的变量_Distortion("Distortion", Range(0,10)) = 0// 水波水平和数值速度偏移的属性 _WaveXSpeed("WaveXSpeed", Range(-0.1, 0.1)) = 0.01_WaveYSpeed("WaveYSpeed", Range(-0.1, 0.1)) = 0.01_FresnelScale("FresnelScale", Range(0,1)) = 1}SubShader {Tags{"RenderType"="Opaque" "Queue"="Transparent"}GrabPass{}Pass{Tags{"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"sampler2D _MainTex;float4 _MainTex_ST;sampler2D _BumpMap;float4 _BumpMap_ST;samplerCUBE _Cube;sampler2D _GrabTexture;float _Distortion;fixed _WaveXSpeed;fixed _WaveYSpeed;float _FresnelScale;struct v2f{float4 pos:SV_POSITION;float4 grabPos:TEXCOORD0;float4 uv:TEXCOORD1;float4 TtoW0:TEXCOORD3;float4 TtoW1:TEXCOORD4;float4 TtoW2:TEXCOORD5;};v2f vert(appdata_full v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.grabPos = ComputeGrabScreenPos(o.pos);o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);o.uv.zw = TRANSFORM_TEX(v.texcoord, _BumpMap);//计算反射光向量float3 worldNormal = UnityObjectToWorldNormal(v.normal);fixed3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;float3 worldTangent = UnityObjectToWorldDir(v.tangent);float3 worldBinormal = cross(normalize(worldTangent), normalize(worldNormal)) * v.tangent.w;o.TtoW0 = float4(worldTangent.x, worldBinormal.x,  worldNormal.x, worldPos.x);o.TtoW1 = float4(worldTangent.y, worldBinormal.y,  worldNormal.y, worldPos.y);o.TtoW2 = float4(worldTangent.z, worldBinormal.z,  worldNormal.z, worldPos.z);return o;}fixed4 frag(v2f i):SV_TARGET{float3 worldPos = float3(i.TtoW0.w, i.TtoW1.w, i.TtoW2.w);fixed3 viewDir = normalize(UnityWorldSpaceViewDir(worldPos));float2 speed = _Time.y * float2(_WaveXSpeed, _WaveYSpeed);fixed3 bump1 = UnpackNormal(tex2D(_BumpMap, i.uv.zw + speed)).rgb;fixed3 bump2 = UnpackNormal(tex2D(_BumpMap, i.uv.zw - speed)).rgb;fixed3 bump = normalize(bump1 + bump2);float3 worldNormal = float3(dot(i.TtoW0.xyz, bump), dot(i.TtoW1.xyz, bump), dot(i.TtoW2.xyz, bump));fixed4 mainTex = tex2D(_MainTex, i.uv + speed);float3 refl = reflect(-viewDir, worldNormal);fixed4 reflColor = texCUBE(_Cube, refl) * mainTex;//折射相关的颜色float2 offset = bump.xy * _Distortion;i.grabPos.xy = offset*i.grabPos.z + i.grabPos.xy; fixed2 screenUV = i.grabPos.xy / i.grabPos.w;fixed4 grabColor = tex2D(_GrabTexture, screenUV);fixed fresnel = _FresnelScale + (1 - _FresnelScale) * pow(1 - dot(normalize(viewDir), normalize(worldNormal)), 5);float4 color = lerp(reflColor, grabColor, 1 - fresnel);return color;}ENDCG}}
}

相关文章:

水波效果

水波效果指在计算机图形学中模拟水面波纹的视觉效果,通常用于游戏、动画或者其他虚拟场景中。主要用于体现水体的动态感,比如水的波动、反射、折射、透明等,可以让人感觉像真实的水一样流动闪耀。 核心特点就是: 动态波纹光学特…...

康谋方案 | BEV感知技术:多相机数据采集与高精度时间同步方案

随着自动驾驶技术的快速发展,车辆准确感知周围环境的能力变得至关重要。BEV(Birds-Eye-View,鸟瞰图)感知技术,以其独特的视角和强大的数据处理能力,正成为自动驾驶领域的一大研究热点。 一、BEV感知技术概…...

【重新认识C语言----结构体篇】

目录 -----------------------------------------begin------------------------------------- 引言 1. 结构体的基本概念 1.1 为什么需要结构体? 1.2 结构体的定义 2. 结构体变量的声明与初始化 2.1 声明结构体变量 2.2 初始化结构体变量 3. 结构体成员的访…...

#渗透测试#批量漏洞挖掘#Splunk Enterprise for Windows 任意文件读取漏洞( CVE-2024-36991)

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...

苹果公司宣布正式开源 Xcode 引擎 Swift Build145

2025 年 2 月 1 日,苹果公司宣布正式开源 Xcode 引擎 Swift Build145。 Swift 是苹果公司于 2014 年推出的一种开源编程语言,用于开发 iOS、iPadOS、macOS、watchOS 和 tvOS 等平台的应用程序。 发展历程 诞生:2014 年,苹果在全球…...

7.list

本篇博客梳理C的STL中的list容器 一、list的基本结构与使用 1.list的介绍 list的底层是带头循环双向链表 带头:含哨兵位 循环:尾节点的next指针指向哨兵位 双向:每个节点具有两个指针域,一个指针指向前一个结点 2…...

Qt+海康虚拟相机的调试

做机器视觉项目的时候,在没有相机或需要把现场采集的图片在本地跑一下做测试时,可以使用海康的虚拟相机调试。以下是设置步骤: 1.安装好海康MVS软件,在菜单栏->工具选择虚拟相机工具,如下图: 2.打开虚拟…...

数据库基础练习4(有关索引,视图完整解答)

建立需要的表 学生表 mysql> create table studnet(sno int primary key auto_increment,sname varchar(30) not null unique,ssex varchar(2) check (ssex男 or ssex女) not null ,sage int not null,sdept varchar(10) default 计算机 not null); Query OK, 0 rows affe…...

实操给触摸一体机接入大模型语音交互

本文以CSK6 大模型开发板串口触摸屏为例,实操讲解触摸一体机怎样快速增加大模型语音交互功能,使用户能够通过语音在一体机上查询信息、获取智能回答及实现更多互动功能等。 在本文方案中通过CSK6大模型语音开发板采集用户语音,将语音数据传输…...

Excel中对单列数据进行去重筛选

在Excel中对单列数据进行去重筛选,可以按照以下步骤操作: 方法一:使用“删除重复项”功能 选择数据列:点击要处理的列头(如A列)。打开“删除重复项”: Excel 2007及以后版本:点击“…...

K8s —基础指南(K8s - Basic Guide)

K8s —基础指南 K8s 是云上部署容器化应用的事实标准。它作为容器的强大编排器,管理容器重启、负载均衡等任务。 理解 Kubernetes 架构 Kubernetes 的关键功能之一是为访问 Pod 提供稳定的端点,尽管 Pod 本身是短暂的。Kubernetes 服务有效地弥补了这…...

ABAP开发中的前导零和末尾零

前导零和末尾零是指分别出现在数字序列中第一个非零数字之前和最后一个非零数字之后的任何零数字。 关于前导 0 在 SAP 系统中,大多数字母数字字段在数据库中存储时都带前导零,完全占用字段的定义长度。但是,当字段显示给最终用户时&#x…...

Baklib赋能数字内容体验个性化推荐提升用户体验的未来之路

内容概要 随着数字化时代的不断发展,用户对内容消费的需求日益多样化,个性化推荐成为提升用户体验的重要手段。Baklib以其先进的技术手段,在数字内容领域内积极推动个性化推荐的实施,从而满足用户在信息获取和内容消费中的独特需…...

关于Redis的持久化

目录 RDB 1.手动触发 2.自动触发 AOF aof的重写机制 Redis虽然是一个内存数据库,但是也是可以将数据存储到硬盘中的,也就是持久化。硬盘的数据是在Redis重启的时候,用来恢复内存中的数据的,即对数据做了一个备份。Redis实现持…...

【C语言标准库函数】指数与对数函数:exp(), log(), log10()

目录 一、头文件 二、函数简介 2.1. exp(double x) 2.2. log(double x) 2.3. log10(double x) 三、函数实现(概念性) 3.1. exp(double x) 的模拟实现 3.2. log(double x) 和 log10(double x) 的模拟实现 四、注意事项 4.1. exp(double x) 的注…...

2024美团春招硬件开发笔试真题及答案解析

目录 一、选择题 1、在 Linux,有一个名为 file 的文件,内容如下所示: 2、在 Linux 中,关于虚拟内存相关的说法正确的是() 3、AT89S52单片机中,在外部中断响应的期间,中断请求标志位查询占用了()。 4、下列关于8051单片机的结构与功能,说法不正确的是()? 5、…...

Python内置函数map(), list(), len(), iter(), hex(), hash()的详细解析,包括功能、语法、示例及注意事项

1. map(function, iterable, ...) 功能:对可迭代对象中的每个元素应用指定函数,返回一个迭代器。 参数: function:要执行的函数(可以是lambda表达式)。 iterable:一个或多个可迭代对象&#x…...

[LVGL] 在VC_MFC中移植LVGL

前言: 0. 在MFC中开发LVGL的优点是可以用多个Window界面做辅助扩展【类似GUIguider】 1.本文基于VC2022-MFC单文档框架移植lvgl8 2. gitee上下载lvgl8.3 源码,并将其文件夹改名为lvgl lvgl: LVGL 是一个开源图形库,提供您创建具有易于使用…...

MySQL视图索引操作

创建学生表; mysql> create table Student(-> Sno int primary key auto_increment,-> Sname varchar(30) not null unique,-> Ssex char(2) check (Ssex男 or Ssex女) not null,-> Sage int not null,-> Sdept varchar(10) default 计算机 not …...

一次奇怪的空指针问题分析:事务、死锁与隐式回滚

最近我们在排查一个诡异的 空指针异常,整个分析过程可以说是跌宕起伏,最终的结论也颇具隐蔽性。今天就把这个问题分享出来,希望对大家有所帮助。 问题现象 在系统中,我们有 单据 B,它通过一个 关联 ID 字段与 上级单…...

Python自动化运维实战:用Paramiko库5分钟搞定SSH批量管理(附完整代码)

Python自动化运维实战:用Paramiko库5分钟搞定SSH批量管理(附完整代码) 运维工程师的日常工作中,服务器管理往往占据大量时间。想象一下,当你需要同时更新50台服务器的安全补丁,或者批量收集100台设备的日志…...

GD32F450VK移植RT-Thread时如何避免SRAM分区导致的HardFault(附解决方案)

GD32F450VK移植RT-Thread的SRAM分区陷阱与实战解决方案 在嵌入式开发领域,GD32F4系列微控制器凭借其出色的性价比和丰富的外设资源,正逐渐成为工业控制、物联网终端等场景的热门选择。然而,当开发者尝试将RT-Thread实时操作系统移植到GD32F4…...

ReflectiveDLLInjection实战:从源码编译到进程注入完整流程

ReflectiveDLLInjection实战:从源码编译到进程注入完整流程 【免费下载链接】ReflectiveDLLInjection Reflective DLL injection is a library injection technique in which the concept of reflective programming is employed to perform the loading of a libra…...

构建向量搜索医疗诊断系统:患者数据的相似性匹配终极指南

构建向量搜索医疗诊断系统:患者数据的相似性匹配终极指南 【免费下载链接】usearch Fastest Open-Source Search & Clustering engine for Vectors & 🔜 Strings in C, C, Python, JavaScript, Rust, Java, Objective-C, Swift, C#, GoLang, a…...

互联网舆情分析系统:基于Nanbeige 4.1-3B的情感与主题挖掘

互联网舆情分析系统:基于Nanbeige 4.1-3B的情感与主题挖掘 最近几年,大家有没有感觉网上的声音越来越复杂?一个热点出来,瞬间就是成千上万条评论,有支持的,有反对的,有理性分析的,也…...

猫抓:重构网页资源获取与媒体管理的高效解决方案

猫抓:重构网页资源获取与媒体管理的高效解决方案 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字内容爆炸的时代,网页资源获取已成为内容创作者、教育工作者和普通用户的…...

全志T3核心板DDR初始化失败:从ZQ校准误导到VREF电压偏差的排查实录

1. 问题现象与初步排查 那天早上刚到实验室,测试组的同事就急匆匆跑过来:"哥,又有三台设备启动不了,uboot都没跑起来!"我接过设备一看,果然又是熟悉的ZQ校准错误提示,这已经是本周第五…...

如何高效配置Unity插件框架:终极解决方案指南

如何高效配置Unity插件框架:终极解决方案指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一个功能强大的Unity游戏插件框架和模组开发平台,专…...

LeetCode 1089 复写零:用双指针从后往前填,保姆级图解避坑指南

LeetCode 1089 复写零:双指针逆向填充的视觉化拆解与实战避坑 当你第一次看到LeetCode 1089题时,可能会觉得"复写零"这个操作听起来简单——不就是遇到0就多写一个吗?但真正动手实现时,很多人会在指针移动、边界处理和数…...

深度学习环境配置太麻烦?试试这个训练环境镜像,一键部署快速上手

深度学习环境配置太麻烦?试试这个训练环境镜像,一键部署快速上手 1. 为什么选择这个训练环境镜像 深度学习项目开发的第一步就是搭建环境,这个过程往往充满挑战: 需要手动安装CUDA、cuDNN、PyTorch等框架,版本匹配问…...