《GPU Gems 1》随书配套资源与源代码下载

原书全文的Web版本:https://developer.nvidia.com/gpugems/GPUGems/gpugems_pref01.html            

原书配套资源下载:http://http.download.nvidia.com/developer/GPU_Gems/CD_Image/Index.html

网格的几何波动

正弦波(平静的水面)

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

  • 波的状态

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

  • 整个表面

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

BTN

因为表面是一个显式函数,所以能在任意给定点直接计算表面方向,不必使用有限差分技术。副法线B和切线T向量分别为x和y方向的偏导数。对在2D水平面中的任何点(x,y),在表面上的三维位置P是:

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

  • Binormal

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

  • Tangent

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

  • Normal = cross(Binormal, Tangent)

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

正弦波的简单变形(波峰尖波谷平的海面)

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

  • 未处理正弦函数求导

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

  • 直接叠加正弦波产生的波浪有太多的“卷”,而真实波浪的波峰比较尖,波谷比较宽。

解决的办法是使用正弦函数的简单变形,从而可控地产生这个效果。我们将正弦函数修改为非负状态,并且赋予它一个指数k。函数及其对于x的偏导数是:

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

几何波(方向波或圆形波)

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

方向波 圆形波
需要的顶点Shader指令较少 需要的顶点Shader指令较多
方向是常数 【GPU Gems 1】自然效果——用物理模型进行高效的水模拟
适用于大水体,波主要由风吹引起 适用于较小的池塘水,产生波的主要原因不是风

Gerstner波(方向波,大水体波峰尖波谷平,浪尖顶点更多)

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

为了有效模拟,需要控制波的陡度。如前所述,正弦波看起来圆滑,这可能是绘制一个平静的、田园诗般的池塘所需要的。但是对于粗矿的海洋,需要形成较尖的浪头和较宽的浪槽。正弦函数的简单变形可以产生所需要的形状,但是最后我们选择了Gerstner波。

早在计算机图形出现之前就研发出Gerstner 波函数,在物理学基础上为海水建模。Gerstner波可以提供一些表面的微妙运动,虽不很明显但是很可信(详细的描述可见Tessendorf2001)。我们选择Gerstner波,是因为它们具有一种经常被忽略的性质:它们把顶点朝着每个浪头移动形成更尖的峰。

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

  •  Qi:控制波陡度。

Qi = 0,正常的正弦波。

Qi = 1 / wi Ai,尖峰

  • 使用Q给美术人员控制陡度【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

BTN(XY有位移)

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

  • Binormal

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

  • Tangent

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

  • Normal

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

Qi过大会在波峰上形成环(法线的z分量)

Tessendorf(2001)从流体力学Navier-Stokes 描述和“展开变换技术”(Lie Transform Technique)推导“波浪起伏”(choppiness)效果时,得到的最终结果是表达在频率域中的Gerstner波的变异。在频率域中,能发现并且消除在波峰顶部的环,而在空间域中,可以清楚地看到这种现象是如何发生的。

当QiWA的加和大于1时,法线的z分量在峰顶变成负值,造成波的自我循环。只要选择Qi使其加和总是小于或等于1,就会形成尖锐的波峰而不再成环。(如上文)

波长和波速(考虑重力)

对波长相似的波进行叠加可以突显水面的活力。于是我们选择中等的波长,然后从它的1/2至2倍之间产生任意波长。中等波长是在写作过程中指定的,而且随着时间的推移而变化。比如,暴风雨中的波浪显然比风和日丽场景中的波浪要大。注意,我们不能够改变正在活动的波的波长。即使渐渐地改变它,波峰也会从原始状态扩展或压缩,看起来非常不自然。因此,我们只能改变当前的平均波长,在波随着时间的推移淡出场景以后,它们将基于新波长而再生。对方向的改变也是如此。

给定一个波长,我们能很容易地计算出波在表面传播的速度。Tessendorf(2001)给出忽略高次项的水的传播关系:

【GPU Gems 1】自然效果——用物理模型进行高效的水模拟

 振幅(振幅和波长之比有一定约束)

虽然可以把振幅看作波长和当前天气条件的函数来求振幅的导数,我们还是要在编写时指定常数比(或由脚本指定)。更准确地说,是由美工对中等波长指定中等振幅。任何尺寸的波,其振幅对波长之比都要与这个指定的比率相匹配。

水体深度(将其存储在顶点中,如顶点色)

我们使用水深度来控制水的不透明度、反射强度和几何波振幅。例如,系统的一对输入参数是透明处深度和最不透明处深度。这显示出深度从离海岸0英尺变到3英尺时,水从透明变到最不透明的现象。这个非常粗糙的建模表达了一个事实:水浅的地方颜色浅,而水深的地方颜色深。有了适当的水深度,就可以对光的传播效果进行更完善的建模。

几何波振幅的衰减基于深度,对物理建模具有很大的实际意义。在水网格碰到水平面处波浪衰减消失,就可以在水网格碰到陡岸的地方把水顶点“固定”住。也可以使波浪涌向浅滩海岸时逐渐平息消失。因为我们约束顶点永远不能低于其输入高度,于是波浪衰减为0的地方总是稍微高于海平面,造成波浪重叠在岸上,这使得我们可以控制波浪冲上岸的距离。

  • R:透明度
  • G:反射强度
  • B:Fresnel,基于视角控制不透明度的衰减

 

相关文章:

  • 2021-05-11
  • 2021-07-04
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-03-04
  • 2022-12-23
猜你喜欢
  • 2021-08-25
  • 2022-12-23
  • 2021-06-14
  • 2022-12-23
  • 2021-12-17
  • 2021-11-18
  • 2022-12-23
相关资源
相似解决方案