美文网首页
【GDC 2019】Technical Artist Bootc

【GDC 2019】Technical Artist Bootc

作者: 离原春草 | 来源:发表于2024-05-11 13:06 被阅读0次

今天学习的是Unreal Engine在GDC 2019上所分享的Distance Field的使用技巧,分享人是Epic的资深TA Ryan Brucks

分享主要分为三部分:

  1. 基于解析的模拟方式:即基于数学公式完成效果的驱动
  2. 基于VS来实现效果的方案
  3. 使用DF与UV来模拟变化的效果

所谓的解析模拟,指的是:

  1. 基于函数来完成效果的模拟
  2. 使用参数作为输入
  3. 而’regular simulation‘则是通过将模拟结果写入某个每帧更新的buffer来模拟

UE中的大部分特效都是采用regular simulation方式实现的,带来的问题就是即使是非常简单的效果,也需要通过更新buffer的方式来完成,代价较高。

解析模拟有如下优点:

  1. 效果可以很容易在多端进行同步
  2. 内存消耗低
  3. Tick消耗低
  4. 表现稳定,一致性高

线性函数就是一个非常简单的函数

回顾一下函数的定义

来看下常用的正弦函数在实际项目开发中是如何用起来的

这里做一个取绝对值的处理,就将下半部分翻转上来

这个函数就可以用来模拟小球在地表上的跳动效果

将之转换为材质实现

效果要怎么暴露给项目,基于玩法进行调制呢?

同样给出材质实现,需要做一个max运算,避免结果异常

通过Time - StartTime运算,可以实现贴花或者其他mesh效果的fading。

这里给了一个实现案例

通过对spawnTime,lifeTime进行处理

这里应该给了一个视频演示效果,用于控制物件的渐变移动

这里依然是材质的处理,比较简单,就不展开介绍了

Frac指令可以用来实现效果的循环

日常debug tips

通过vector noise实现随机效果

通常用一个byte来存储数据,用定点数表示,精度是1/255,

直接用可能会有精度问题,通过+0.5可以解决

这里给了具体的效果展示

接下来用一个复杂的例子来对上面介绍的内容做阐释

static mesh的wireframe效果如上图,由众多的quads组成,顶点色是随机的,支持控制时间来实现缩放

基于法线添加位置的抖动

将标量参数替换成一个动态的参数,实现offset的动态变化

另一个烟花也使用了同样的方法

通过这种方法,可以用一些小尺寸的静态mesh来实现环境的点缀,比如这里用作fog haze cards或者dust modes

逻辑跟前面的类似,通过随机的算法来控制颜色、尺寸、速度等,基本上没有额外的消耗。

这里介绍了一个基于spline的billboard方法,从而以2D的方法实现3D的效果。这种方法在UE3就存在了,已经是一种非常成熟常见的方案。

上面两种效果都可以通过上述方法实现。

材质函数节点是Spline Thicken

Gears5中原来的粒子效果是CPU模拟的,计算消耗太高,换成GPU,则由于需要跟CPU交互,同样具有不低的消耗。

最后采用的是基于VS来实现的方案,用来点缀环境、实现部分武器、gameplay特效,从而以较低的消耗实现了同样的效果。

Gerstner Wave基本介绍

基于顶点实现的材质蓝图

这种方法可以自动在多端进行同步,而且可以不用tick就实现splash效果

基于波浪的周期来调用frac,同时基于当前点到波峰的距离,来控制相位。

基于这个解析逻辑,还可以在水波达到波峰的时候,添加一个粒子特效,以实现更逼真的效果。

这里是效果展示。

基于DF,我们可以拿到到岸边的距离,并基于这个来控制海浪的相位。

同样,还可以用来模拟海浪跟海中的石头或者障碍物交互的效果:即在有障碍物的地方,添加一些resistance,避免水波溜过去(见蓝色线条,黄色是原始的)

这里是通过DistanceToNearestSurface这个节点来获取数据的

用debug颜色显示

具体的表现效果

传统的海浪实现中,相位是一个常量,可能在不同的波浪上,数值不同,但基本整个生命周期是一个常量,但是这并不是必要的,按照上面的,我们增加对相位的动态调整可以得到更好的效果。

将海浪的方向与地形高度的梯度(基于这个应该可以大致计算出到岸边的距离,这样也可以省去distance field贴图的消耗)结合起来,还可以实现更逼真的模拟效果。

Distance Field的梯度用于描述海岸的方向,这个方向可以用于控制海浪的方向。

通过点乘,可以知道障碍物的那一面需要产生碰撞后的浮沫。

这里介绍了flowmap的实现原理,flowmap用于控制水流的方向。

flowmap会通过UV动画来实现水流的效果,但是如果UV偏移过大,效果就会有问题,所以通常会用两张贴图来弱化瑕疵:

  1. 在一个区间里,用第一张贴图来控制水流的扰动
  2. 当到达阈值时,替换成第二张贴图主导
  3. 当达到第二个阈值时,第一张贴图就回复到原点,如此交替反复

上图中的红色跟灰色曲线表示两张贴图的权重值。

需要注意的是,UE的flowmap用的是triangle wave而不是正弦波,不过区别不大。

Flowmap叠加DF贴图跟法线贴图,可以进一步加强表现。

上图是一个河流的效果,近岸的flowmap会对地面的法线贴图进行采样,并基于结果对水流进行调制,使得水流看起来像是部分浸没石头的样子。

这里展示的是如何基于Distance Field来调整flow的,从而实现水流在障碍物周边绕行波动的效果。

这里给了实现的算法细节。

总结

参考

Gerstner Wave实现方式

Lagged Wave实现方式

Curl Noise在很多场合中有应用,比如给水体添加扰动等,具体可以看一下Siggraph 2007的文章。

海洋效果中,会使用scale flowmap来实现浮沫从石头上流下来的效果。流动的频率跟最大尺寸的wave的周期相匹配,UE有一个ScaleUVsbyCenter节点可以用于替换Flowmap内部的传动函数,这里介绍了具体的实现方法。

相关文章

网友评论

      本文标题:【GDC 2019】Technical Artist Bootc

      本文链接:https://www.haomeiwen.com/subject/tlxsfjtx.html