热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

shader反射水面_【博物纳新】水面涟漪反射效果开源库测评

【博物纳新】是UWA重磅推出的全新栏目,旨在为开发者推荐新颖、易用、有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视

【博物纳新】是UWA重磅推出的全新栏目,旨在为开发者推荐新颖、易用、有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性。很多时候,我们并不知道自己想要什么,直到某一天我们遇到了它。

大千世界,无奇不有!更多精彩内容尽在开源库:lab.uwa4d.com

导读

WaveProvider是一个组件和着色器库,可以使用Unity轻松表达波形,利用该组件可以实现受物理影响的水面动态涟漪效果,

效果展示

实现原理

1. 添加用于绘制倒影图像的反射相机

考虑到主摄像机的位置可能会动态地改变,所以反射摄像机也需要使用脚本控制使其动态移动到合适位置(与主相机相对水面对称)以绘制正确的反射图像。

2. 根据投影面编写一个水面投影反射的着色器

投影时,需要统一投影侧的空间并确定投影面(项目中的这个投影面就是水面)。使用反射相机的变换矩阵变换,并渲染每个对象。当使用主摄像机在水面上绘制对象时,使用反射相机的变换矩阵来转换对象顶点。

下面的代码段是水面投影反射着色器的一部分:

1 struct v2f

2 {

3 float2 uv : TEXCOORD0;

4 float4 vertex : SV_POSITION;

5 float4 ref : TEXCOORD1;

6 };

7

8 sampler2D _MainTex;

9 float4 _MainTex_ST;

10 sampler2D _RefTex; //反射绘制的纹理

11 float4x4 _RefVP; //反向VP矩阵输入

12 float4x4 _RefW; //反射对象的局部变换矩阵

13

14 v2f vert (appdata v)

15 {

16 v2f o;

17 o.vertex = UnityObjectToClipPos(v.vertex);

18 o.ref = mul(_RefVP, mul(_RefW, v.vertex));

19 o.uv = TRANSFORM_TEX(v.uv, _MainTex);

20 return o;

21 }

22

23 fixed4 frag (v2f i) : SV_Target

24 {

25 return tex2D(_RefTex, i.ref.xy / i.ref.w * 0.5 + 0.5);

26 }

其中_ RefTex是反射绘制的纹理,_ RefVP是反向VP矩阵输入,_RefW是反射对象的局部变换矩阵。顶点着色器使用_RefW将顶点转换为世界坐标,再通过_RefVP将世界坐标转换为反射相机的投影空间,片元着色器将其转换为普通坐标转换+纹理坐标,并用于主摄像机渲染。

然后,我们得到了如下效果:

这样,即使相机移动或反射物体移动,旋转或缩放,也可以在没有违和感的情况下显示正确的投影图像。

3. 在投影着色器的基础上编写一个根据法线扭曲的着色器

接下来,我们添加扭曲投影的代码,这里通过引用法线贴图的方式实现。

1float2 offset = bump * _BumpAmt * _RefTex_TexelSize.xy;

2i.ref.xy = offset * i.ref.z + i.ref.xy

其中_BumpAmt是可调节的影响系数,_BumpAmt越大,则涟漪越强烈,但同时会影响到水面的反射效果,因此建议将参数控制在300以下,并按自己的需求进行调整。

_BumpAmt参数对效果的影响示意图

4. 根据脚的运动输入波动方程

利用波动方程,使波浪的高度可以作为纹理。(此处不对波动方程进行详细介绍)

左边区域是波纹输入纹理的调试界面,接下来,将存储在此纹理中的波的高度(被视为高度图)解析为法线并扭曲反射纹理,实际上,当从高度图计算法线贴图时,也可以直接求解偏导数,从而输出正常值作为着色器的凹凸。感兴趣的朋友可以参考该作者的另一篇相关文章:http://esprog.hatenablog.com/entry/2016/10/24/183733

同时根据角色脚的运动输入更改波动方程

作者在人物的脚点上附上了Collider组件和一个改造了InkPainter的CollisionPainter的脚本,可以理解为在人物的脚点上各加了一个笔刷,具体实现可以参考InkPainter插件里的Brush类。

PS:InkPainter插件链接附在文末,喜欢Splatoon的,或者想实现类似Splatoon效果的朋友,该插件可以提供不错的参考价值。

性能测试

使用UWA GOT Online对这个效果进行了性能测试。为了更真实地反映这个项目的渲染开销,我们使用了非多线程渲染的版本。

同时准备了4个版本的场景作比较:

版本A:即原版,3个角色加水面涟漪反射效果;

版本B:3个角色,去除涟漪反射效果,同时将地板Shader更换成简单的Diffuse;

版本C:9个角色加水面涟漪反射效果;

版本D:9个角色,去除涟漪反射效果,同时将地板Shader更换成简单的Diffuse。

测试4个版本的场景后,通过UWA GOT Online解析数据,最终得到对比数据如下:

我们观察到,有无涟漪反射的效果,对场景的帧率有一定的影响,但随着角色数量的上升,场景帧率发生了明显的下降,通过逻辑代码的分析我们发现开销主要集中在渲染模块上,接下来我们具体看一下Camera.Render的耗时均值对比:

下面我们以版本A为例具体看一下渲染耗时曲线:

可以观察到渲染耗时在8ms左右波动,其中不透明渲染在5ms左右,半透明渲染在1ms左右。然后再来对比一下四个版本的不透明和半透明渲染的平均耗时:

这里我们可以看到,开启效果后,不透明渲染和半透明渲染开销均有上升,且影响较大,开启效果会额外增加40%左右的渲染开销。

考虑到项目中的角色材质比较复杂,会对测试结果造成一定影响,对红米Note3这类低性能机型而言,能跑到这个数据,该效果的性能还是可以接受的,但建议开发者在使用时控制反射场景的复杂度,同时可以考虑优化水波反射的Shader以达到很好的优化效果。

注意事项

1)文章前两图素材来源于《LOST SPHEAR》,图三来自推主オノッチ利用该组件制作出来的效果,twitter链接:https://twitter.com/onotchi_/status/958188421045866496(仅做效果参考,并非项目内容);

2)该项目需要搭配InkPainter(nv1.2.1或更高版本)使用。

该项目来自UWA开源库,您可以下载、收藏或评论Waveform Provider项目。开源库传送门:https://lab.uwa4d.com/



推荐阅读
  • VMware 15.5.7 中文版激活方法
    本文提供了一种有效的方法来激活 VMware 15.5.7 的中文版本,同时介绍了如何利用最新的激活码进行操作,确保用户能够顺利使用。 ... [详细]
  • 深入理解Java反射机制
    本文将详细介绍Java反射的基础知识,包括如何获取Class对象、反射的基本过程、构造器、字段和方法的反射操作,以及内省机制的应用。同时,通过实例代码加深对反射的理解,并探讨其在实际开发中的应用。 ... [详细]
  • HDU1085 捕获本·拉登!
    问题描述众所周知,本·拉登是一位臭名昭著的恐怖分子,他已失踪多年。但最近有报道称,他藏匿在中国杭州!虽然他躲在杭州的一个洞穴中不敢外出,但近年来他因无聊而沉迷于数学问题,并声称如果有人能解出他的题目,他就自首。 ... [详细]
  • 探讨了生成时间敏感的一次性伪随机密码的方法,旨在通过加入时间因素防止重放攻击。 ... [详细]
  • A1166 峰会区域安排问题(25分)PAT甲级 C++满分解析【图论】
    峰会是指国家元首或政府首脑之间的会议。合理安排峰会的休息区是一项复杂的工作,理想的情况是邀请的每位领导人都是彼此的直接朋友。 ... [详细]
  • 2022年4月15日的算法练习题,包括最长公共子序列和线段树的应用。 ... [详细]
  • 本文深入探讨了HTML5中十五个重要的新特性,为开发者提供了详细的指南。 ... [详细]
  • 尽管已经查阅了相关说明,但关于Html.Partial和Html.RenderPartial在ASP.NET MVC3中的使用,我仍然感到困惑。 ... [详细]
  • 3144:[Hnoi2013]切糕TimeLimit:10SecMemoryLimit:128MBSubmit:1261Solved:700[Submit][St ... [详细]
  • 题目描述墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令ÿ ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • 本文介绍了如何使用Workman框架构建一个功能全面的即时通讯系统,该系统不仅支持一对一聊天、群组聊天,还集成了视频会议和实时音视频通话功能,同时提供了红包发送等附加功能。 ... [详细]
  • ZOJ 2760 - 最大流问题
    题目链接:How Many Shortest Paths。题目描述:给定一个包含n个节点的有向图,通过一个n*n的矩阵来表示。矩阵中的a[i][j]值为-1表示从节点i到节点j无直接路径;否则,该值表示从i到j的路径长度。输入起点vs和终点vt,计算从vs到vt的所有不共享任何边的最短路径数量。如果起点和终点相同,则输出无穷大。 ... [详细]
  • 行为设计模式:命令模式详解
    命令模式是一种行为设计模式,它通过将请求封装为对象,使得可以使用不同的请求来参数化客户端,支持请求的排队、日志记录以及提供命令的撤销和恢复功能。 ... [详细]
  • 优雅地记录API调用时长
    本文旨在探讨如何高效且优雅地记录API接口的调用时长,通过实际案例和代码示例,帮助开发者理解并实施这一技术,提高系统的可观测性和调试效率。 ... [详细]
author-avatar
小景森的童年
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有