风格化水面实现笔记

演示视频

https://youtu.be/Z8lJ-8gI7V0

一些实现细节

Base Color

传入三个颜色值:深海色,浅海色和波峰色
根据海床深度在深海色和浅海色之间插值,
再根据波峰高度(disp map)在上一步得到的颜色和波峰色之间插值

法线

在造型得到disp map的同时算一张对应的normal map,渲染时需要用到这个normal,否则geometry虽然改了但是渲染的结果是平的。
在这个基础上加上两张水面细节bump map,以不同的方向进行uv流动。tiling也要不同。
bump map的scale根据水面离相机的远近变化,越远越小。这样做一是因为远的地方没必要加细节法线,二来可以缓解大范围normal map tiling的视觉重复感。

三个深度

  • 海床深度:从上到下,由正交相机捕捉到的深度值
  • 海面在相机视角的深度 surfaceDepth
  • 海床在相机视角的深度 sceneDepth
    sceneDepth - surfaceDepth得到光路在水中travel的距离

反射

根据当前相机位置,找到关于海平面的平面对称点,生成一个反射相机,记录renderTexture。
//这个反射相机只看见特定layer和天空盒。近处的石头如果用这种方法反射会出问题,可以不让反摄像机看见近处的石头,反正近处反射弱。
在渲染水面时采样这张renderTexture,采样的坐标受到世界空间的法线扰动。
采样得到的颜色跟base color相乘,比例可调。

折射

折射用GrabPass实现,采样坐标受到切线空间的法线扰动,
然后把采样得到的折射颜色值和BaseColor根据之前算出的waterTravelDistance插值。travel距离短,能看到水底,距离长,不能看到水底。
用这样的方法实现折射的好处是,整个shader可以是opaque的,半透明的部分用这个方法代替。

根据fresnel结合反射和折射

一个trick:接近岸边的部分专门降低了反射率,提升了折射率。这样可以让水体和岸边更好的融合,视觉上不会显得突兀。

Wave Foam

在生成disp map的时候可以根据mesh的曲张程度(jacobian >1, <1)来决定哪里生成浮沫。
生成的浮沫需要流动(uv流动),需要随时间消散,需要二值化来达到卡通的效果。
浮沫整体强度在接近岸边的时候下调,避免突兀。

Coast Foam

利用之前算出来的waterTravelDistance,这个值很小的地方就是接近岸边的地方(不一定是岸,也可以是泡在水里的石头等等)
//这个方法的不足之处在于,浮沫区域的宽度会受到近岸除海床的斜率的影响。斜率很小则浮沫区域很宽,斜率很大则浮沫区域很窄。
使用sin函数和一张noise贴图叠加,并且进行二值化,最终得到白色的岸边浮沫。
浮沫整体强度也受到fresnel值的影响。脚下的浮沫看起来淡,远处比较强。(参考原神)(大概是因为这样的浮沫在近处看很丑吧)
这里用的fresnel的值和之前混合折射反射用的fresnel值不一样。这个值计算的时候,法线使用(0,1, 0)而非实际法线。否则在波浪大的时候,浮沫强度忽明忽暗,效果不好。

风格化高光Specular项

使用phong shading的公式计算,但是用到的法线是特殊的法线。
特殊法线由实际法线和(0, 1, 0)根据srufaceDepth插值而来。这样远处的specular就会更聚拢,近处更分散/受扰动更大。
根据一个threshold进行二值化,以达到风格化的效果。
这个specular项加在reflection项上参与fresnel混合,这样近岸处更加柔和。

焦散caustic

一张voronoi噪声用两个不同的流动速度和方向进行采样,并用min混合。
用unity projector把混合结果投影在terrain上海拔低于0的部分
接近海拔0的地方做渐隐,离相机过远的地方做渐隐。

潮湿沙地

同样使用unity projector在terrain上海拔低于0的部分投下淡淡的黑色。
用sin函数扰动边界并且在边界处blur。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容