水波效果

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

核心特点就是:

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

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}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/13811.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis | 十大数据类型

文章目录 十大数据类型概述key操作命令数据类型命令及落地运用redis字符串(String)redis列表(List)redis哈希表(Hash)redis集合(Set)redis有序集合(ZSet / SortedSet&…

Linux之安装docker

一、检查版本和内核是否合格 Docker支持64位版本的CentOS 7和CentOS 8及更高版本,它要求Linux内核版本不低于3.10。 检查版本 cat /etc/redhat-release检查内核 uname -r二、Docker的安装 1、自动安装 Docker官方和国内daocloud都提供了一键安装的脚本&#x…

【WebLogic】Oracle发布WebLogic 14c最新版本-14.1.2.0

根据Oracle官方产品经理的博客,Oracle于2024年12月20日正式对外发布了WebLogic 14c的第二个正式版本,版本号为 14.1.2.0.0 ,目前官方已开放客户端下载。该版本除继续支持 Jakarta EE 8 版本外,还增加了对 Java SE 17(J…

feign 远程调用详解

在平常的开发工作中,我们经常需要跟其他系统交互,比如调用用户系统的用户信息接口、调用支付系统的支付接口等。那么,我们应该通过什么方式进行系统之间的交互呢?今天,简单来总结下 feign 的用法。 1:引入依…

解决 npm : 无法加载文件 D:\nodeJS\node_global\npm.ps1,因为在此系统上禁止运行脚本。

问题 在我将nodeJS从18更新到22之后,我发现在黑窗口运行npm run dev,可以成功启动项目,但是在Cursor的终端中却报如下错误: PS D:\DESKTOP\项目\vue-ems-admain> npm run dev npm : 无法加载文件 D:\Users\Download\nodeJS\no…

快速对QWen2.5大模型进行微调

先看看训练结果: 目录 前言什么是LLaMA-Factory?安装LLaMA-Factory准备数据集配置微调参数运行微调脚本评估和保存模型使用微调后的模型可视化微调大模型总结 前言 在当今人工智能领域,大模型(如LLaMA、GPT等)的微调…

深入理解linux中的文件(下)

目录 一、语言级缓冲区和内核级缓冲区 二、C语音中的FILE* fp fopen(“./file.txt”,"w"): 四、理解磁盘结构: 物理结构 逻辑结构 五、未被打开的文件: 六、更加深入理解inode编号怎么找到文件: 七、对路径结构进行…

自动化测试、压力测试、持续集成

因为项目的原因,前段时间研究并使用了 SoapUI 测试工具进行自测开发的 api。下面将研究的成果展示给大家,希望对需要的人有所帮助。 SoapUI 是什么? SoapUI 是一个开源测试工具,通过 soap/http 来检查、调用、实现 Web Service 的…

BUU28 [GXYCTF2019]BabySQli1

常规万能密码,发现登不上去 过滤掉了or,,当尝试了n种方法以后,最关键的是发现()居然也被过滤了 哈哈,那玩个淡, 再搜wp!! 当输入admin的时候,提示密码错误&#xff0…

Zenoh在工业物联网场景中的性能研究

论文标题 中文标题:Zenoh在工业物联网场景中的性能研究 英文标题:On the performance of Zenoh in Industrial IoT Scenarios 作者信息 Miguel Barn, Luis Diez, Mihail Zverev, Jos R. Jurez, Ramn Agero Miguel Barn:Ikerlan技术研究中心…

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

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

掌握API和控制点(从Java到JNI接口)_37 JNI开发与NDK 05

*.so的入口函数&#xff1a;JNI_OnLoad() 执行System.loadLibrary()函数时&#xff0c; VM会反向调用*.so里的JNI_OnLoad()函数。用途有二&#xff1a; 1. VM询问此*.so使用的JNI版本编号。 2. VM要求*.so做一些初期设定工作(Initialization)&#xff0c;例如登记<函…

MySQL数据库 (三)- 函数/约束/多表查询/事务

目录 一 函数 (一 字符串函数 (二 数值函数 (三 日期函数 (四 流程函数 二 约束 (一 概述 (二 约束演示 (三 外键约束 三 多表查询 (一 多表关系 1 一对多&#xff08;多对一&#xff09; 2 多对多 3 一对一 (二 多表查询概述 (三 内连接 1 查询语法 2 代码实…

EGO-Planner文章解读(一)——论文原理和算法实现

在fastplanner中&#xff0c;ESDF 对于评估梯度大小和方向至关重要。然而轨迹优化过程只覆盖了 ESDF 更新范围的非常有限的子空间&#xff0c;计算全图的ESDF是非常冗余的。除此之外&#xff0c;在建图的时候只能看见障碍物的表面&#xff0c;看不见障碍物的后面/内部&#xff…

C语言——深入理解指针(1)

深入理解指针 内存和地址内存究竟该如何理解编址呢&#xff1f; 指针变量和地址取地址操作符&#xff08;&&#xff09;指针变量和解引用操作符&#xff08;*&#xff09;指针变量如何拆解指针类型解引用操作符 指针变量的大小 指针变量类型的意义指针的解引用指针-整数voi…

人人皆可创建自己的AI应用:DigitalOcean GenAI平台正式上线

近日海外知名云平台DigitalOcean宣布&#xff0c;DigitalOcean GenAI 平台现已全面开放——这是一个强大且易用的解决方案&#xff0c;将彻底改变团队创建和部署人工智能应用的方式。 这一新平台延续了 DigitalOcean 普及 AI 开发的使命&#xff0c;让独立开发者到大型团队都能…

4.攻防世界 unseping

进入题目页面如下 直接给出源码&#xff0c;开始代码审计 <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;方便调试和查看代码结构 highlight_file(__FILE__);// 定义一个名为 ease 的类 class ease {// 定义私有属性 $method&#xff0c;用于存储要调用的方法名priv…

Llama最新开源大模型Llama3.1

Meta公司于2024年7月23日发布了最新的开源大模型Llama 3.1&#xff0c;这是其在大语言模型领域的重要进展。以下是关于Llama 3.1的详细介绍&#xff1a; 参数规模与训练数据 Llama 3.1拥有4050亿&#xff08;405B&#xff09;参数&#xff0c;是目前开源领域中参数规模最大的…

1-R语言概述

1.认识R语言 1.1 选择R语言的依据 免费的软件编程方便&#xff0c;语言灵活&#xff0c;图形功能强大优秀的内在帮助系统高质量、广泛的统计分析、数据挖掘平台国际上R语言已然是专业数据分析领域的标准 1.2 R的来源 ​ R是S语言的一种实现。S语言是由 AT&T贝尔实验室…

oracle ORA-27054报错处理

现象 在oracle执行expdp&#xff0c;rman备份&#xff0c;xtts的时候,由于没有足够的本地空间&#xff0c;只能使用到NFS的文件系统但有时候会出现如下报错 ORA-27054: NFS file system where the file is created or resides is not mounted with correct options根据提示信…