【Unity3D】水面特效

news/2024/11/17 2:47:40/

1 前言

        水波特效 中通过屏幕后处理实现了环形水波效果,本文通过 Shader Graph 实现了模拟水面特效,包含以下特效细节。

  • 深水区和浅水区颜色差异;
  • 水面有波纹,并且在移动;
  • 水面起伏波动;
  • 水面边缘有水泡;
  • 水中物体因折射而扭动。

        本文完整资源详见→Unity3D水面特效。

2 水面特效实现

        由于本文需要使用 Scene Color 节点的颜色缓冲区信息模拟水面折射现象,而 Scene Color 节点只能在 URP 或 HDRP 管线下才能正常工作(详见→Shader Graph节点),因此本文选择在 URP 管线下实现模拟水面特效。

2.1 场景搭建及环境配置

        1)场景搭建

        在 URP 项目中搭建场景如下。

        说明:水面模型是一个长方形,并且网格不能太稀疏,否则对顶点的上下波动将不太自然。

        2)配置 Universal Render Pipeline Asset

        由于实验中使用了 Scene Depth 和 Scene Color 节点获取深度缓冲区和颜色缓冲区信息,需要在 Universal Render Pipeline Asset 中勾选 Depth Texture 和 Opaque Texture,如下。

        3)主图配置

        由于水面是透明的,需要在主图的 Graph Settings 中将 Surface Type 属性设置 Transparent,并且取消勾选 Cast Shadows(投射阴影)和 Receive Shadows(接受阴影)如下。

2.2  水面 Shader Graph

        1)主图

        Water.shadergraph

        WaterDepth、FinalWaterColor、WaterNormal、WaterPosition 都是自定义节点,释义如下,Smoothness 用于调整水面光滑度。

  • WaterDepth 节点:水面到水底的深度计算;
  • FinalWaterColor 节点:水面最终的颜色(混合深浅水颜色、泡沫颜色、背景折射颜色);
  • WaterNormal 节点:水面法线;
  • WaterPosition 节点:水面坐标。

        2)WaterDepth 子图

        WaterDepth.shadersubgraph

        说明:WaterDepth 子图用于计算水面深度;Scene Depth 节点用于获取不透明物体的深度值(水底深度),Screen Position 节点输出的 w 分量是水面的深度,两者相减就是水面到水底的深度值。SubtractDepth、DepthStrength 释义如下。

  • SubtractDepth:深度减去的参数,其值越大浅水区越大;
  • DepthStrength:深度加强的参数,其值越大浅水区越小。

        如果将 Water Depth 子图的输出直接连到主图片元着色器的 Base Color 上,显示效果如下。从图中可以看到,Water Depth 节点能够较好得识别物体的边缘。

        3)FinalWaterColor 子图

        FinalWaterColor.shadersubgraph

        说明:FinalWarterColor 子图用于计算水面最终的颜色(混合深浅水颜色、泡沫颜色、背景折射颜色),WaterColor 节点用于计算水面颜色(混合深浅水颜色、泡沫颜色),WaterRefraction 节点用于计算背景折射颜色。

        4)WaterColor 子图

        WaterColor.shadersubgraph

        说明:WaterColor 子图用于计算水面颜色(混合深浅水颜色、泡沫颜色),BubbleColor 节点用于计算泡沫颜色,ShallowColor、DeepColor、WaterDepth 的释义如下。

  • ShallowColor:浅水区的颜色;
  • DeepColor:深水区的颜色;
  • WaterDepth:水面到水底的深度,用于混合深水区和浅水区的颜色。

        5)BubbleColor 子图

        BubbleColor.shadersubgraph

        说明:BubbleColor 子图用于计算泡沫颜色,BubbleSpeed、BubbleDensity、BubbleFilter1、BubbleFilter2、BubbleBrightness、WaterDepth 的释义如下。

  • BubbleSpeed:水泡移动的速度;
  • BubbleDensity:水泡的密度,其值越大水泡越小且越密集;
  • BubbleFilter1:水泡过滤参数,其值越大,水泡越稀疏;
  • BubbleFilter2:水泡过滤参数,其值越大,水泡越稀疏;
  • BubbleBrightness:水泡亮度;
  • WaterDepth:水面到水底的深度,用于过滤气泡,只有浅水区才有气泡。

        6)WaterNormal 子图

        WaterNormal.shadersubgraph

        说明:WaterNormal 子图用于计算水面法线,NormalStrength、WaterDepth 的释义如下。

  • NormalStrength:法线最大强度;
  • WaterDepth:水面到水底的深度,用于调整法线强度,深水区波纹较深,浅水区波纹较浅。

        7)WaterPosition 子图

        WaterPosition.shadersubgraph

        说明:WaterPosition 子图用于模拟水面起伏效果,通过调整顶点坐标的 y 分量实现,WaveHeight 用于调整水面起伏的最大高度。由于 WaterPosition 子图的输出连在顶点着色器上,而 WaterDepth 是在片元着色器中计算的,因此不能使用 WaterDepth 对 WaveHeight 进行混合(即深水区水面起伏大,浅水区水面起伏小)。

        8)WaterRefraction 子图

        WaterRefraction.shadersubgraph

        说明:WaterRefraction 子图用于计算背景折射颜色,RefractionStrength 用于调整折射偏移强度,Screen Position 节点用于获取屏幕顶点的 uv 坐标,Scene Color 节点用于获取颜色缓冲区纹理(仅在 URP 或 HDRP 管线下才能正常工作),详见→Shader Graph节点。

2.3 运行效果


http://www.ppmy.cn/news/1052837.html

相关文章

PHP8中自定义函数-PHP8知识详解

1、什么是函数? 函数,在英文中的单词是function,这个词语有功能的意思,也就是说,使用函数就是在编程的过程中,实现一定的功能。即函数就是实现一定功能的一段特定代码。 在前面的教学中,我们已…

【CSS动画07--旋转菜单】

CSS动画07--旋转菜单 介绍HTMLCSS 介绍 旋转菜单 HTML <!DOCTYPE html> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><meta name"viewport" content"widthdevice-width,ini…

Mysql group by使用示例

文章目录 1. groupby时不能查询*2. 查询出的列必须在group by的条件列中3. group by多个字段&#xff0c;这些字段都有索引也会索引失效&#xff0c;只有group by单个字段索引才能起作用4. having条件必须跟group by相关联5. 用group by做去重6. 使用聚合函数做数量统计7. havi…

一句话木马攻击复现:揭示黑客入侵的实战过程

准备环境 OWASP虚拟机xfp 7与xshell 7 ​ DVWA系统默认的账号密码均为&#xff1a;admin/admin 1、命令注入中复现 ​ 攻击payload 127.0.0.1 | echo "<?php eval(\$_POST[\"cmd\"])?>" > /var/www/shell.php 这个命令的目的是在服务器…

LEADTOOLS Imaging SDK Crack

LEADTOOLS Imaging SDK Crack 高级开发人员工具包包括ActiveX和WPF/XAML控件。 LEADTOOLS Imaging SDK为文件格式导入/导出、图像压缩、图像显示和效果、颜色转换、图像处理、TWAIN扫描、图像通用对话框、数据库集成、打印和互联网提供了基本和高级的彩色图像功能。 LEADTOOLS …

全志orangepi-zero2驱动编写2,控制电平高低

使用驱动编写控制高低电平 可看我前俩篇文章&#xff1a; 【1】全志orangepi-zeor2驱动编写 【2】驱动函数框架详解 检索芯片手册关键信息 知道GPIO基地址 知道PC偏移地址 知道想要控制的端口的信息 知道数据位如何操作 代码实操 驱动代码 #include <linux/fs.h&…

PHP自己的框架session()使用(完善篇六)

1、PHP自己的框架session() 2、session类&#xff08;SessionBase.php&#xff09; <?php class SessionBase {/*** 设置session*/public static function set($name, $data, $expire600){$session_data array();$session_data[data] $data;$session_data[expire] time…

python自动发文章到微信公众号4-群发消息

使用Python发送群发消息。具体的实现步骤如下&#xff1a; 导入必要的库&#xff1a; pythonCopy Codeimport requests构建请求的URL和参数&#xff1a; pythonCopy Codeurl "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_tokenACCESS_TOKEN"…