
框架和基础结构:
water body actor 只是编辑工具
water mesh actor才是生成mesh的主体,各种水的无缝连接就是因为它的存在,融合的地方会有一个过渡材质去处理过渡的效果。
water body custom 可以指定一个staticmesh形状,比如游泳池,喷泉等,由于用户指定了mesh所以并不需要生成water mesh actor。相反其他的几个(ocean river lake)是有一个water mesh actor的。
除了 water body custom 其他的lake ocean river三个body actor都会自动创建water mesh actor,
如果是ocean 这个water mesh actor 默认大小 3平方公里,也可以手动调整大小,三公里以外
更远的地方是far mesh和far mesh material,通过调整Far distance mesh extent设置这个分界线
far mesh 是简化的mesh 更加的cheap。
lake和ocean的样条曲线是闭环的,每个点都在同一个平面,修改不了
river 样条曲线不是封闭的,每个点可以有高度,流速,河宽等属性,引擎可以根据这些点的速度生成flowmap。
波浪:
湖面和海面的波浪是由Gerstner wave 资产定义的,Gerstner wave是单独的资产的好处是不管gameplay和渲染都会拿到同一套wave的数据,会有统一的表现。
Gerstner wave资产能定义波的个数 频率 振幅 波长等。
Gerstner wave的计算相对简单高效,性价比比较高
通过时间和世界位置就能获得当前点的数据,而不依赖于其周边的点。
另一个好处是多个波层可以根据贡献度排序,对于mobile平台可以去掉贡献度比较小的波,达到优化效果
渲染:
四叉树性能好,重新生成一遍几微秒到几毫秒
绿色湖泊,红色河流,蓝色海洋,黄色和紫色过渡地区,过渡区域可以自定义过渡材质去渲染。
每个tile只需渲染自己的type的材质,比如海洋的tile只会渲染海洋的材质,而不会处理flowmap。
如果这个几个tile 同材质类型 同lod,就可以把它们intance到一起。这些都是在water mesh actor中处理。并不依赖于auto instance,所以移动端可以做到instance。
stat watermesh 可以查看instance之后的mesh数据
lod变形比较特殊,这样子它的边缘三角形均匀性更好。看起来更加的平滑。
材质:
所有的水体共用一个母材质,不同的水体用不同的material instance。
水体材质基于特殊的shadingmodel
这个Singlelayerwater就是模拟现实水体的物理原理。散射 吸收光等。
从曲线中可以看到,在吸收最多的是红色,然后黄色,绿色,所以海水整体呈现的是蓝色。
横轴是光的波长,纵轴代表 1/ax, ax=多少米水深这个光完全被吸收;
比如蓝色的纵轴坐标值大概是0.005,所以1除以0.005就是200米,就是说200米水深蓝光完全被吸收
所以single layer water material节点中 Absorption这个引脚输入就是200。
前两个代表光在水中是怎么传播的。
PhaseG 是各向异性散射系数,如果这个水体我认为是同性散射,直接输入0就可以了
colorScaleBehindwater 为了更好的表现焦散的效果。
single layer water需要用Opaque或者Mask模式去渲染。因为Translucency 是不受Volume function的影响的。
它是利用了散射和Schlick相位函数来渲染体积感。
在水材质中 Opacity是驱动water的visibility从而控制体积感的BSDF和表面的BRDF之间的比例。如果输入为0的话,它将跳过整个的体积着色,把水保持着Opaque。
材质中的wave
输入 time pos得出normal和WPO
Normal会把远处的normal给抹平一些
河流的flowmap处理,海洋和湖泊不走这块逻辑
海岸和海洋的白沫处理
把流体模拟的结果叠加到材质中
水下材质
并不是基于物理的,可以按照艺术家的意愿去定义
Ripple solver涟漪没有速度的变化
mobile上的水 mesh部分可以用引擎的 材质部分建议重写