基于上一篇我们简单地实现了水体看上去像那么回事的效果。
这次来复习一下,风格化水体渲染的整个流程。
唔姆,终于讲到这一章了,再写两篇就能追上做的进度了。
这章的效果还是很好的,很符合我对二次元的想象(doge)
等我贴个效果图。
待会我们从效果图来看看风格化的水是有哪几块组成的。
唔姆,抛去之前实现的纸片人,我们可以看到水有深浅、反射、折射,运动、焦散、浮沫等效果,基本上比我见过的水还要完整了,而这些就是我们这次要实现的主要内容。
首先首先,显示整个shader的设置
render type和render queue选择的是transparent,保证到时候海滨那一段有些透明度,可以直接看到水下的沙子。
当然,还要注意cast和receive shadow选项,明明视频里是勾了的,但实操里这么干,水上就看不到有阴影的存在了,而且还会有大块的暗色存在,可能是水面自己的阴影所致,这里去掉那两个勾是本人主观能动性的体现。
那么来到shader吧。
xdm,直接从最后的final_color开始。
仔细一想,从最终颜色的组成上,就非常直接可以看到我们要连连看哪些内容了,比一块一块的讲下来,再拼感觉更直观一点。
左上角部分使用water Color、reflect Color和wave Color直接相加出出了水面的颜色,而左下角这一块则是使用Water Opacity插值出了水面和水底的颜色,这里的Opacity实际上就是一个Fresnel的效果。
再右边一点,与Shore Color插值,做出浅水区沙滩可见的效果。
再右边一点,感觉再看一眼就要爆炸,我们则是加上了浮沫的效果。
最后,加上水最前端白白的一条ShoreEdge,做个max就结束啦。至于为什么要做max呢?我也忘了,回寝室再看看吧。
当然右下角还有一块,是用来实现波浪效果的顶点动画,因此,顶点的坐标和法线都要相应的做个改变。
这么捋一遍,应该就算比较清晰了,虽然看上去还是不太简单。
哟西,从最简单的先先手。
Water Depth
唔,其实也不是easy,主要有些节点不太熟悉,跟着连当然会,但自己连的时候估计就要痛苦好久了。
这边要点估计是从Depth推出世界坐标,然后与真实的世界坐标相减,得到WorldDepth,会得到一个岸边比较暗的值,意会一下,懂吧
Water Color
这一块很easy啊,难一点的估计是左下角这一块对WaterDepth做运算的部分。
没事,只要放弃理解,你就等于理解了一切。
主要就是把WaterDepth取负,再做个控制,用exp投放到0-1上,就形成了靠岸白,远处黑的感觉了,用这来lerp Depth和Shallow的颜色,很合理。
之后在做个Fresnel即可。
SurFace Normal
这一段我们就来实现水面的法线扰动了,做了太多次了,我就摸了(doge)
Reflect Color
唔姆,反射部分采样平面反射得来的_ReflectionTex即可,左下部分是加入法线的扰动,ReflectDistort用于控制强度,当然也要乘以一个Fresnel,这么说来总共就用来两个Fresnel了
Caustics Color
Cautics焦散,还是第一次碰到,奇怪的单词数增加了。
但原理其实还是很简单的,
又是熟悉的根据时间采样两遍,uv取反即可,移动的速度都不用操作。
最下边,是类似上面Range的操作,也是用于得出一个类似岸边的效果。
当然,对焦散的贴图可以在PS里做些处理比如手动的偏移下通道,就会做出更逼真的效果。在ASE中也可以实现,就是性能要差一些了
UnderWater Color
Grab Screen Color要配合GrabScreenPosition使用,所以xyzw才能作为采样uv吧,左下角是法线的扰动,右边先是得到了一个SceneColor用来做后来的Shore部分,后面加上焦散颜色就是完整的UnderWater Color了。
Water Shore
左上角做一个熟悉的range出来,然后做个smoothstep来控制它的范围。xdm可以看看下面对比。
Foam
Foam我愿称之为最困难的一部分。
确实有点复杂了,
左下角是控制泡沫的一波波形状,上面是Form的一个mask,不然海后部也要一会儿白一会儿黑了,
中间部分让泡沫做个消融,越靠近岸边,消融越大。
WaveVertexAnimation
唔姆,这一块,也是我们参与度极低的一块,不要考虑一块大佬写的模块,小做了三层波浪,
上面部分是Pos,记得转到到模型空间,中间根据用户原来worldPos相减得出高的部分,附上了波浪的颜色
下面使用切线和副切线叉积出了法线,再转换到对象空间即可。
那么终于就讲完了,讲到后面有点摸了,毕竟在家里嘛。
总是,晚安好梦。
另,我的波浪号被翘走了,这次没打的理由,敬请原谅。
您必须 登录 才能发表评论