一个简单的Unity可控水流实现方式
VIEW CONTENTS

一个简单的Unity可控水流实现方式

2022-4-19 18:04| 发布者: Gordon520| 查看: 894| 评论: 0
摘要: 又更新一下,加了点浪花,gerstner波效果不错,但是我不知道怎样修改波形让他不那么规整,不知道有没有大佬有让gerstner波不那么规整的法子https://www.zhihu.com/video/1454532002493546496======================= ...

又更新一下,加了点浪花,gerstner波效果不错,但是我不知道怎样修改波形让他不那么规整,不知道有没有大佬有让gerstner波不那么规整的法子



https://www.zhihu.com/video/1454532002493546496

============================================================

gerstner波我试了下,效果气势完全不同了

代码原理奉上,这个大佬讲的很详细:

https://zhuanlan.zhihu.com/p/404778222

====================

1.感激有大佬给我提供贵重的定见:有大佬提议将正余弦换成gerstner波代替可能效果会更佳,我觉得这个提议实在是太妙了!各位有兴趣的能够去尝尝,后续有空也要继续改进,其实这个Shader还有很多细节能够做文章。除了浪花波形,还能够加碰撞边沿泡沫,还能增加焦散光,关于流体,一直是特效的热门项目,能做的细节实在太多了。以后晋级更新了会继续更新文章的哈。

gerstner波更能够那种粗暴的海浪(但是算法就复杂的多了),正余弦只适用于安静沉着僻静的水面,给大家举荐2篇文章

Justin:Gerstner 水波详解

Unity 水、流体、波纹根底系列(三)--海浪(Waves)

2.有人问我是不是TA,只是个想做TA但是编程和美术都是零根底的小白哈,只是一个小小的菜鸟前端,对于TA这个职业我是一直可望而不成即的哈!究竟?结果这篇文章独一有难度的就是这个噪波的实现,而且我也不是代码的消费者,我只是代码的搬运工。也许不难但很关键,只要搞定了噪波,就搞定了近一半的特效了

3.关于这个海洋插件,雀氏做的不错,但是我说中看不顶用,同事天然是很气的。认真想想:根据2021年的游戏尺度,端游Batches要控制在1200以内,手游batches要控制在220以内,这个插件只要一打开就间接飙升至3k+。暂不考虑这个插件在各个平台不会有bug的问题,仅仅是Batches这一项就注定不能做游戏了。可能是拿来做影视用的?但是影视用的这种海面用houdini做不是很简单粗暴么,而且交互的流体只能houdini这种专业特效软件来做,做完间接用houdini的mantra或者Karma或者RS渲染了,当然如今已经有很多影视流程初步用Unreal来渲染了(UE4.27有了离线渲染功能,而且速度间接超过曾经最快的RS了,而且老黄根据皮克斯运用的技术制做的Omniverse这种平台能够各个3D软件实现实时交互,C4D和Blender也有了和UE实时交互的插件了,目测,这种流程的应用只会越来越广泛。虽然我是Unity党,但是不得不承认UE在影视层面雀氏很香),用这个插件的效果天然有点鸡肋了。究竟?结果市场能留下来的,往往只要走数量最低端和走质量最高端,这种上不上下不下的最难受。所以中看不顶用我觉得我说的没错。

===================================================================

分割线===================================================================

最近同事在完成一个虚拟仿真项目中问大伙一些问题,我也去看了下热闹,问题还没处置但是感觉找bug过程中程序很卡。究其原因,这个项目的要求是要有一个能够随时间变革的水面(要求不高,改变水的流向大小等等)。

但是这个项目是一个在阅读器运行的网页端的交互程序,但是Batches 5~6K感觉实在有点为难阅读器了,重要是为了实现这个能够变革的水面在工程中参加了某个插件(不清楚详细是什么,貌似是一个Unity的海洋仿真插件吧),这个插件实现的水面效果挺好的,当然代价就是很吃性能,有点中看不顶用。一打开间接飙升3K+的Batches。这个消耗对于端游项目都是间接暴毙的存在。

正好最近看了下Unity Shader层面是一些材料,比较感兴趣,就写一个简单的可调节水流的水面shader练练手。

我就在这简单分享一下本人的做法,传道不传术,根底Shader 矩阵转换那些我就不细说了,网上材料也很多,我也就不吐槽了,有大佬有更佳的实现思路欢送在评论区补充。shader代码写起来很简单,重要的是思路。

正文初步:怎样样实现一个流水的效果呢?

1.法线+置换(normal & displament)

假如要求不高,很多游戏或者程序里面采用的做法都是给一张水面波纹的贴图来影响平面的法线,然后偏移法线的uv即可实现一个简单水面的定向挪动。这种做法很典范很实用而且效果也是不错的。上面提到的水流标的目的的效果其实也就已经实现了,但是这个项目的要求是水面的幅度也是会变革的,究竟?结果法线改变的只是外表光线的反射角度,并没有让模型外表发生形变,用法线强度来调节模型的外表凹凸,能调节的幅度非常有限而且效果比较一般,在角度和光线不是很好的时候几乎没有效果。

所以,要实现水面能够调节大小的功能,用只改变法线(normal)的方式显然是不到的,我要的是能真正改变模型顶点的置换(displament)效果。

这时候美术可能就比较头疼了,在unity的可视化Shader编辑器中是没有置换节点的(隔壁虚幻的材质蓝图可是有的,不知道unity为啥不封装一个)。不外问题不大,因为自己用的就是unity最根底的Build-in管线,撑持的可视化Shader插件也不多,代码实现置换效果也长短常简单的。

2.三角函数(sin & cos)

怎样最简单画一个活动的水面呢?幼儿园小朋友都知道——画几条海浪线就完事了

说到海浪线,天然就都知道我要用什么函数了吧。(其实不说也知道了,小题目出卖了我)。好了,这一点说完了,只需要让顶点的起伏根据海浪线布列就ok了。要让他动起来也简单,偏移正(余)弦函数的相位就ok了,要调节的他的高度只需要改变正(余)弦函数的振幅就能够了,要改变浪花的密集程度也只需要改变函数的频次就ok了。

好了,没错,你学废了,分享完毕!

假如要求不高,好比我这个项目做到这,其实已经都实现了项目的底子要求了,后面也就不用管了(仿佛原来这项目就不用我管哈)。

但是,很多人应该城市想到一个问题吧,这样导致的问题就是水面海浪都长短常工整规律的布列,压根就不像是水。所以后面的内容估计才是很多人想知道我怎样处置的。

3.再加亿点点细节——万物皆可噪波(noise)

没错,天然规律是熵增的,是趋于混乱无序的,而规律的反义词就是随机,很多小机灵鬼估计就初步用随机数了吧,你能够尝尝,效果应该会好点,但是多少会有点奇异。仅用随机生成的数,出来的随时机出格的离散没有规律,也就是这种类似电视机花屏的白噪声



貌似还能用,但是肯定不到完美,你能够像其他大佬一样加个渐变(gradients)

好比这位大佬,效果已经好很多了,能够间接使用下尝尝,不外我使用的不是这个。

https://blog.csdn.net/qq_23030843/article/details/104353774

很多美术估计早就想到了,估计都没耐心看了,不就是个噪波嘛,吐槽这么多。

没错,你玩各种设计软件,3D软件,渲染器或者可视化Shader编辑器,都能给你生成各种noise,确实都有各种现成的封装好的节点,但是unity的Shaderlab并没有给你封装,

那怎样办呢?不用呗,或者本人写一个?

经常处置图形相关的设计师或者美术尤其是玩渲染或者特效的,肯定经常会接触到各种噪波贴图,这些噪波贴图你会发现很随机但是又不会过于离散,这类贴图的颜色过渡非常的平滑,不至于太跳,这就很奈斯了,正是我们想要的。最常见的就是柏林(perlin)噪波,simplex噪波,湍流(turbulence)这些了。

你可能间接就生成或者下载一个间接来用了,但是究竟?结果是一张贴图,精度会有限制。

你想理解这种程序化怎样来的,去知乎百度都能搜出来一堆,估计你又会来气了,说了一堆叫我去百度?

百度过后你会发现,虽然很多,但是看起来估计很懵逼,我也是,这个以后有兴趣能够垂垂研究,我只要有一个noise就行了,至于是选择哪种noise都不同不大,看哪个顺眼就用哪个,但是用习惯就建议只用一种,他们调节起来的大小参数也城市是你所熟悉的。

话不多说:间接上代码:

https://blog.csdn.net/qq_36107199/article/details/87191348

这个链接里几种常见的noise代码都写好了,只需要开启程序员的终极奥义——CV大法(粘贴复制)即可

我的做法就很简单,就是用噪波辅助三角函数做用于我的vertex的世界坐标y坐标,让vertex的y坐标根据本人的x和z的值有关联即可,这样就有一个连结了一定正余弦函数规律带有很多细微变革细节的海浪了。

我使用的代码如下:




o.Sin_srcPos = half4(world_srcPos.x+_noise2*0.001,_hight_z*sin(_frequency_z*world_srcPos.x + _speed_x*_Time.y )+_noise3*_hight_x*cos(_frequency_x*world_srcPos.z + _speed_z*_Time.z)+_noise,world_srcPos.z-_noise*0.001,world_srcPos.w);

得到三个noise 在让xz只分别遭到这个noise一点点影响,这样顶点在程度标的目的也就能够有一个细微的扰动,此外垂直标的目的的高度基于x和y的世界坐标位置的同时也让其幅度会和x和z的noise值的有一定关联,给一个适宜的系数让他有肉眼可见的影响即可,而且这种起伏变革不会太跳戏,是过渡非常缓和圆润的,以包管海浪的外形大致是一个有上下起伏平滑变革的三角函数即可。

这里要注意的是,这个三角函数必须是用于顶点上,而且一定要要在顶点的模型右边转化成世界坐标之前进行该操做。这样你就会发现得到了一个比较不错的网格。而且在此处设定一些调整高度的属性,这样就能够根据需要对水面的高度对材质进行脚本控制来调节水面高度,在频次和偏移速度处同理,这样就能够调成整个网格的详细形态和变革速度。

这也就实现了我想要的置换效果了,当然,要想置换效果好,模型顶点就得足够多,模型面数必须得足够高才行,我用的是一个分段100*100的平面。

噪波的使用太常见,做用又很间接,噪波不管用于粒子炊火流体的发射源上还是渲染的通道上都能提供愈加丰富的变革,增加大量的细节来提升传神感。


4.再加亿点点细节——叠加法线(normal)

然而模型的面数是有限的,想通过顶点动画来提供足够多的细节对于性能的消耗也长短常宏大的。顶点动画实现了,水面的立体变革也就实现了,所以剩下的就是通过法线贴图来增加亿点点细节。

一张贴图能提供的细节长短常有限的,由于是通过偏移UV来实现水面活动的视觉效果,仅用一张贴图就会发现模型外表的起伏没多久就又反复了,这样的规律变革就会让人感觉很粗拙很假。

这里你为了变革更多样,完全能够继续使用之前的noise来实现,我采用的是用一个水波纹的法线贴图进行采样,

然后用到了一个常用的比较讨巧的做法,就同样的纹理复制一份然后将二者的纹理进行混合,两张纹理在大小和速度标的目的上只要有一定的不同,那么纹理反复循环的周期就会变得很长,从而给人一种没有反复,无限细节的错觉。

详细实现的关键代码也很简单(至于怎样从模型空间到切线空间的转化我就不不细说了,相关材料也很多),和前面一样,系数不重要,有不同即可,当然详细效果还是需要本人调整一个适宜的范畴。




5.再加亿点点细节——万物皆可菲涅尔(fresnel)

其实到了这一步也就底子做出来,大家都知道水面是啥样的,同样的水面,时而明澈通明可一眼窥底,时而如翡翠碧玉一般带有颜色,所以呀,要想水有足够的传神感,尤其是动态的水,那么他的颜色和通明度一定是有变革的,这个变革和人与光线的视角都有关系,一般近处正对着水面时候水是很明澈的是通明的,远处的水都是带有颜色的,根据这样一个现象,只需要有一个根据光线和视线角度的混合即可增加不少细节,给人一种很传神的错觉。

菲涅尔也是一个常用的衰减贴图,在渲染时候加上一点点菲涅尔的颜色混合能够让模型外表颜色有一个渐变效果,使得物体外表颜色变革愈加丰富,而且会增添很多的透视感以及立体感。

6.一些细节补充

由于水是通明的,所以其漫反射(也就是本人颜色)比重其实不大,通明物体的颜色也重要由能够穿过的光线决定,水这种通明物是没有颜色的,我们看到的颜色重要取决于水反射和透过水的颜色。

首先是通明物体,不用说了RenderQueue值就要设置为3000了,然后Zwrite写入能够关了,这里由于项目需要钻进水底查看,所以我把默认后背裁剪也给关了,不同的Blend 混合方式也会带来完全不同的感觉,好比OneOne叠加颜色就会比较亮,水就会变得很明澈,但是问题也就是很便利过爆呈现死白,用在一些二次元的水面效果也许还行,大家不大白各种叠加的含义完全能够通过调试来理解,假如你对这层面感兴趣,说明你的视觉比其他层面更敏感,那么就让眼睛来给你一个反响会映象愈加深化,理解愈加透彻。

这几行代码别忘了调整哦:



最后的菲涅尔叠加效果也很简单:



当然:这里你也能够通过一个值来改变pow函数的输入参数,用来控制菲涅尔的强度

此处的texColor是我定义的一个属性,再次进行叠加会让水面增加更多的颜色细节,这种图片会随着vertex一起飘动,使用一些天空来仿真倒影或者一些水底照片来仿真水底都能为水面效果增色不少。

非常感激您能看完我的分享。

话不多说,附上我B站视频的链接,能够看看水面的最终效果,觉得对您有协助记得点赞存眷和三连哦(当然假如附加的链接对您有协助也别忘了给源链接的博主一个点赞哦)

https://www.bilibili.com/video/BV1y44y1a75p?spm_id_from=333.999.0.0


当然,要想实现一个传神的流体效果,不成能是一个Shader能实现的,一套流体系统其实长短常复杂的,假如想制做传神的影视级别流体效果,建议还是交给Houdini,Realflow这样的专业特效软件来制做吧,这只是一个节省性能的讨巧做法。

究竟?结果,都流畅实时了还要啥自行车。至于流体也一直是我所感兴趣的,后续假如遇到了不错的插件或者比较好的实现方案还会继续更新


路过

雷人

握手

鲜花

鸡蛋

最新评论

关闭

菜鸟C4D推荐上一条 /9 下一条

菜鸟C4D与你一起从零开始!
十年专注C4D学习

( 浙ICP备13033195号-2 )Copyright   ©2013-2024  Powered by©Discuz!  技术支持:cainiao    

|网站地图