【Unity3D】水面特效
1 前言
水波特效 中通过屏幕后处理实现了环形水波效果,本文通过 Shader Graph 实现了模拟水面特效,包含以下特效细节。Shader Graph 基础知识详见→Shader Graph简介、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 子图用于计算背景折射颜色,通过对颜色缓冲区的纹理进行随机偏移采样实现,折射的 Shader 实现详见→反射和折射。RefractionStrength 用于调整折射偏移强度,Screen Position 节点用于获取屏幕顶点的 uv 坐标,Scene Color 节点(类似于 Shader 中的 GrabPass)用于获取颜色缓冲区纹理(仅在 URP 或 HDRP 管线下才能正常工作),节点详见→Shader Graph节点。
2.3 运行效果


声明:本文转自【Unity3D】水面特效。
【Unity3D】水面特效的更多相关文章
- Unity3d粒子特效:制作火焰效果
效果 分析 真实的火焰效果,通常包括:火.火光.火星等组成部分,而火焰对周围环境的烘焙,可以通过灯光实现,如点光源. 针对火焰组成部分,我们可以创建对应的粒子系统组件,实现相应的效果,如下图所示: 1 ...
- 【Unity3D】基于粒子系统实现烟花特效
1 需求实现 粒子系统ParticleSystem 中介绍了粒子初始化.粒子发射.发射器形状.渲染器.碰撞.子发射器.拖尾等粒子系统的基本用法,本节将基于粒子系统实现烟花特效. 实现需求如下( ...
- 精选9个值得学习的 HTML5 效果【附源码】
这里精选了一组很酷的 HTML5 效果.HTML5 是现 Web 开发领域的热点, 拥有很多让人期待已久的新特性,特别是在移动端,Web 开发人员可以借助 HTML5 强大功能轻松制作各种交互性强.效 ...
- 充满想象力的 JavaScript 物理和重力实验
在这个列表中挑选了9个物理和重力实验,用来展示 Javascript 的强大.几年前,所有这些实验都必须使用 Java 或 Flash 才能做.在下面这些惊人的例子中,就个人而言,我比较喜欢仿真布料的 ...
- 9个充满想象力的 JavaScript 物理和重力实验
在这个列表中挑选了9个物理和重力实验,用来展示 Javascript 的强大.几年前,所有这些实验都必须使用 Java 或 Flash 才能做.在下面这些惊人的例子中,就个人而言,我比较喜欢仿真布料的 ...
- Unity塔防游戏开发
Unity3D塔防开发流程 配置环境及场景搭建编程语言:C#,略懂些许设计模式,如果不了解设计模式,BUG More开发工具:Unity3D编辑器.Visual Studio编译器开发建议:了解Uni ...
- 精选9个值得学习的 HTML5 效果
此文转自:http://www.cnblogs.com/lhb25/p/9-html5-effects.html,仅供本人学习参考,版权归原作者所有! 精选9个值得学习的 HTML5 效果[附源码] ...
- 玩家福音:10款最佳Linux免费游戏
“我能在Linux平台上游戏吗?”这类疑问正困扰游戏玩家,那么答案就是“快去Linux平台吧!”.开源组织一直以来坚持不懈为Linux操作系统开发不同类型的游戏,在Linux平台下的游戏完全不亚于其他 ...
- 开源玩家福利:十大Linux免费游戏
假如当你考虑从Windows平台迁移至Linux平台时,“我能在Linux平台上游戏吗?”这类疑问正困扰着你,那么对此这有一个答案就是“快去Linux平台吧!”.感谢开源组织一直以来坚持不懈为Linu ...
- Unity3D特效-场景淡入淡出
最近公司开始搞Unity3D..整个游戏..特效需求还是比较多的.关于UI部分的特效淡入淡出.看网上用的方法都是用个黑东东遮挡然后设置alpha这么搞....本大神感觉非常的low.而且很渣.故奋笔疾 ...
随机推荐
- Spring Loaded代码热更新实践和原理分析
1.引言 开发者在编码效率和快速迭代中的痛点场景包括: 修改代码后,需要频繁重启应用,导致开发效率低下: 实时调试时,不能立即看到代码修改的结果: 大型项目中,重启的时间成本较高. 针对这些问题,本文 ...
- 项目完成小结:使用Blazor和gRPC开发大模型客户端
前言 先介绍下这个项目. 最近我一直在探索大语言模型,根据不同场景训练了好几个模型,为了让用户测试使用,需要开发前端. 这时候,用 Gradio 搭建的前端是不太够的,虽说 GitHub 上也有一堆开 ...
- Java扩展Nginx之七:共享内存
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 作为<Java扩展Nginx>系 ...
- MyBatis 常用工具类
SQL 类 MyBatis 提供了一个 SQL 工具类,使用这个工具类,我们可以很方便在 Java 代码动态构建 SQL 语句 String newSql = new SQL() ({ SELECT( ...
- 使用Docker安装Apollo并使用SpringBoot连接配置中心
上篇文章我们学习了Apollo的本地安装,如果还不会本地安装的朋友可以查看之前的文章进行了解和学习链接地址(https://www.cnblogs.com/eternality/p/17583023. ...
- Vue: 在vscode中添加vue的代码片段
创建vue文件模板 打开vscode,文件–>首选项->用户代码片段,在弹出的搜索框中输入vue,回车 删除原内容,将如下内容粘贴 { "Print to console&quo ...
- 王道oj/problem12(动态申请内存存储数组)
网址:http://oj.lgwenda.com/problem/12 思路:用输入的整型创建对应数组,用scanf消除换行键: 用gets()输入语句并输出,再释放. 代码: #define _CR ...
- (转) [Android测试] AS+Appium+Java+Win自动化测试之三: 基础知识和Appium界面
一.把上一章的demo先看懂 AndroidContactsTest.Java public class AndroidContactsTest { //Driver private AppiumDr ...
- [Go笔记] 基础-01: Golang发展简史、著名项目及基本使用
引言 Golang,又称Go语言,是一门开源的静态类型编译型编程语言.自从2007年由谷歌的罗伯特·格里泽默(Robert Griesemer).罗布·派克(Rob Pike)和肯·汤普森(Ken T ...
- 【动画进阶】神奇的 3D 磨砂玻璃透视效果
最近,群友分享了一个很有意思的效果: 原效果的网址:frosted-glass.该效果的几个核心点: 毛玻璃磨砂效果 卡片的 3D 旋转跟随效果 整体透明度和磨砂感.以及卡片的 3D 形态会随着用户移 ...