APP下载

基于FFT的海面模拟渲染方法

2020-07-09张军鹏

现代信息科技 2020年21期
关键词:海面

摘  要:使用快速傅里叶变换来计算深海海浪的网格与法线信息,添加风力的影响构建深海海面的波形并计算法线信息;然后对Gerstner波形进行挤压,构建靠近岸边的海水波形,计算水体的法线。添加光照模型,丰富海面的纹理。借用Unity的着色器进行渲染,实时的展现出海面的波浪效果。在增加海面的采样点的情况下,依然可以保持较好的时效性。提升了海平面的细节,增强了视觉效果。

关键词:快速傅里叶变换;海面;法线;渲染

中图分类号:TP391.9;P731.22               文献标识码:A 文章编号:2096-4706(2020)21-0024-04

Sea Surface Simulation Rendering Method Based on FFT

ZHANG Junpeng

(Qingdao University,Qingdao  266071,China)

Abstract:FFT(fast Fourier transform)is used to calculate the grid and normal line information of deep sea waves,and the influence of wind is added to construct the waveform of deep sea surface and calculate the normal line information;then Gerstner waveform is extruded to construct the seawater waveform near the shore and calculate the normal of water body. Add a lighting model to enrich the texture of the sea. Using Unitys shaders to render,real-time show the wave effect of the sea. In the case of increasing the sea surface sampling points,it can still maintain good timeliness. Promote the details of the sea level,enhance the visual effect.

Keywords:fast Fourier transform;sea surface;normal line;rendering

0  引  言

模擬自然景观中的流体一直是计算机图形学比较重要的研究方向,其中包括火焰、水流等常见的流体。国内外大量学者都在虚拟海洋环境可视化方面做了很多工作,因为海洋环境复杂多变,海面可能会受到风力、洋流等许多因素的影响,生成复杂的海浪波形,提升海面波浪可视化的实时性和真实性成为了国内外学者研究的难点。在渲染海面波浪纹理的方面,初期使用的方法是在海面网格上映射上一张法线贴图,再通过纹理的扰动得到近似海浪的效果。之后有学者发现Gerstner波可以模拟水体的波浪,其波形的浪尖被可以较为真实得描绘出水体的波浪。1986年,Fournier与Reeves[1]第一次使用Gerstner波构建出生动的海洋模型。2001年,Jerry Tessendorf[2]提出可以在海平面模型上添加采样点,使用快速傅里叶变换(FFT)生成多种波形相互叠加的逼真海面模型并提高了实时性。童若锋等[3]对顶点波以及短峰波进行分类造型,模拟水波的大致形状。徐迎庆[4]等使用Saint-Venant方程组来构建海浪模型。在海面光学模拟上,2016年,唐勇等[5]对近岛海洋场景中的海水色彩进行实时绘制,2018年,Jeschke S,Sk?ivan T,Müller-Fischer M等[6]使用小波变换对水体变换进行离散化处理,该方法是FFT生成模型的拓展,可以准确计算出物体与流体直接的作用。

本人爱好研究游戏制作,为了在游戏虚拟海洋场景中渲染出完整真实的海面模型,并且添加合适的光线效果,需要构建一个完整的海面渲染可视化流程。本文首先使用FFT波浪方程计算法线贴图用于生成深海海浪,之后使用变形的Gerstner波用于生成海岸边的波浪模型,并添加光照模型,生成较为完善的渲染框架。

1  海面海浪模型及法线

逼真的海面模拟特效需要有海面网格的划分,模拟真实的海洋波浪,也需要模拟光照在海平面上的折射与反射的效果,本文所用技术为可编程的着色器,使用FFT变换与Gerstner波形实时构建深海与岸边波形与法线,并添加菲涅尔反射,渲染工作由Unity的shader编写。

1.1  深海波浪模型

深海海面的模拟波浪可以看做是多个不同周期不同偏执的正弦曲线的叠加而来:

y=Aisin(ωix+tφi)                    (1)

其中,Ai为正弦曲线的振幅大小,ωi=,L为正弦曲线的波长,φi为波的初相移动。通过正弦曲线叠加而来的波形看起来较为圆滑,比较适合绘制平静的湖面,但是对于波涛汹涌的海洋,还需要绘制尖型的浪头的较宽的浪槽,这里本文在正弦波的水平方向增加位移,使用Gerstner波形来描绘海浪的浪尖。

(2)

其中,x、z为平面坐标中的长宽,Di为波峰运动方向,φi为波的初相移,i为每个Gerstner波形的序号,根据公式可以看出在相位波的传导过程中添加了的相位偏移进行挤压波形,当Qi=0时,这时波形是一个简单的正弦波,而当Qi=时候会得到波峰最尖的波形。在海洋统计学中,波浪振幅可以看成一个高度函数h(x,t),X是一个二维坐标(x,z),将Y中时间t去掉,使用h(x,t)替换可得:

Y=h(x,t)×cos(ωiDi×(x,z))       (3)

將公式添加一个虚部可得:

Y=h(x,t)×cos(ωiDi×(x,z))+isin(ωiDi×(x,z))      (4)

然后我们设α为以弧度为单位的参数,根据欧拉公式e iα= cosα+isinα带入式(4)可得到:

Y=h(x,t)eiωiDiX                         (5)

此公式为海洋波形的初步形式,这时我们就可以根据快速傅里叶变换可快速对大量的cos和sin波形求和,这样我们可以得到Tessendorf所提到的海洋公式:

(6)

本文设置参数为水平方向的坐标,t为时间,函数 就得到在相应时间与地点的海平面的高度,这里可以看出就是对做的离散傅里叶变换:

(7)

其中,k为波的方向向量,Lx和Lz为定义海面的长宽,N和M为定义离散采样的点数,如果采样的数值越高,波形就会越平滑,但是计算的时间也会随之增加。通过式(6)可以看出,只要得到频谱h(k,t),就可以对其进行离散傅里叶变换得到平面的高度。这里频谱设置为:

(8)

其中, 为  的共轭复数,k为  的模,ω(k)为角频率ω和波长的关系。

本文设置参数ω(k)2=gk,k为波浪传播的模,g为重力加速度,其中Tessendorf使用傅里叶频谱函数创建初始时刻海面高度场的傅里叶频谱海面高度模型表示为:

(9)

其中,ξr和ξi为两个相互独立的高斯随机数,Ph(k)为方向波谱:

(10)

A为频谱的幅度,向量为传播的风向,l=v2/g,这里l等于风速在v时候的最大波浪。这样远洋处的波形就形成了。

1.2  深海波浪法线计算

在求得深海海平面高度方程后,可以使用差分法求法线,根据已求得的高度公式 因此本文可求得波浪的空间梯度为:

(11)

而海平面参数方程可表示为:

P(x,z,t)=(x,H(x,z,t),z)       (12)

海平面的次法线与切向量分别可以看作是海平面方程对x与z求偏导数求出,因此,次法线N1可以表示为:

(13)

海平面切向量T可以表示为:

(14)

因此海面的法线N可以由切向量T叉乘次法线N1求出法线:

(15)

海面的网格与法线的公式已经得出,接下来就可以对公式进行计算了,但是使用标准DFT性能消耗较大,所以本文使用FFT进行计算。网格信息的采样点数N、M会影响海面的渲染效率,但是本文借助GPU的强大计算性能和使用FFT并行计算大量频率信息,可以实时有效地完成对海平面的渲染。

1.3  靠近岸边的海面波浪模型

远洋海浪可以看作是不同频率不同方向的多种波形叠加而成,而近岸处的海浪则会因为速度差而造成偏转,近岸处的海浪波形可以看作是波形收到了来自岸边方向的挤压而造成的。为了形成尖型的波峰,我们通过对横轴进行挤压这里使用x=x-bsin(x)来对横轴进行挤压,b为表示挤压程度的参数,我们设自变量为q,生成Gerstner波:

X(q)=q-b×sin(q)

可得到Gerstner波形如图1所示。

因为在自然界中靠近岸边的波浪往往是带有倾斜角度的波浪,本文为了形成海浪倾斜的波形,将刚刚生成的Gerstner波形前半个周期进行挤压,后半个周期进行拉伸,从而形成了向岸边倾斜的波浪形状。波浪的倾斜角度会随着离岸边的距离增加而增加,所以本文也构建不同倾斜角度的函数,这里函数如下,函数图像如图2所示。

r=1+k×x2

这里r为挤压的系数参数,将模型转换为3D情况下,只需添加方向向量即可,因为越靠近海岸的情况下,海浪的频率就会变得越高,所以本文在将靠近海岸的海浪波形频率增大。

1.4  靠近岸边的海面波浪法线计算

由N=normailze()得,只需求得  便可以得到一个函数周期中的法线,根据之前的公式推导可得:

(16)

因此可得出海平面的法线向量,此时求得的海浪法线为2D的,若要求得3D的法线,只需要将法线乘以海浪的传播方向dir即可:

(17)

这样就求得了近海的波形与法线,但是此时的波形高度和法线都太平滑,所以在计算时这里使用噪声图对模型的UV以及法线进行不规则的微弱扭曲,得到不规则的扭曲后的波浪。

2  海面光照

为了渲染出自然界真实的海面效果,光照模型是必不可少的。光照模型是用于计算光源经过物体反射、折射、散射后返回到渲染画面的数学模型表示方式。随着GPU的性能提升,光照模型的计算效率和效果都得到了极大的提升。自然界的水体可以看作是一个理想的镜面模型,但不同的是,在光线到达此模型时主要分为两部分:一个是穿透海面经过折射的光线和被反射的光线,这两种光线受到反射与折射的系数影响。

2.1  反射光

在镜面反射中,入射角等于反射角,之前已经求出海面波浪函数h(x,t)以及海面的法向量N,当知道射入海面的光线方向向量Li就可以得到反射后的向量Lo:

(18)

2.2  菲涅尔反射

菲涅尔反射描述了一种光学现象,当光照到物体表面时,一部分发生反射,另一部分则进入物体内部,发生折射或散射;相比直接的反射和折射计算,菲涅尔反射更接近真实情况。菲涅尔反射光学模型一般运用于水面效果,在自然界中,当看向近处的水面时,反射较少,而远处的水面反射较多,即反射率随着入射角的增大而增大,这种现象称为菲尼尔效应。设F0为反射系数,e为视线的方向,N为海面的法向量,在实时渲染时通常使用Schlick菲涅尔近似等式:

(19)

海平面因为不同的反射率而形成的光照模型是重要的海面纹理之一,在本文中,通过不同方向的法线、反射率而形成的海面纹理更加具有真实感和实时性。

3  实验与结果

3.1  实验环境与实验效果

本文实验采用的机器配置为:Intel Core i7-8750,双核四线程,主频2.2 GHz,内存16 GB,NVIDIA GTX1060显卡,CUDA版本为10.2。海面网格信息与实时渲染由Unity引擎,通过c#以及cg着色器语言实现,本文在渲染计算中,绝大部分是FFT海面网格以及法线的计算,采样的点数为512×512,通过着色器的渲染,可以呈现出逼真的海面波浪紋理,实验效果图如图3所示。

3.2  实验对比结果

本文算法在渲染时的真实感和实时性都较好,影响渲染效率的主要因素是采样点的个数,将本文方法与投影网格方法做出对比如表1所示。

对比本文方法与投影网格法的帧数中可以看出,本文方法渲染效率略低于投影网格法,但是渲染出来的真实性较好,在采样点增加的情况下帧数虽然有所下降,但是帧数依然可以保持在200帧以上,可以够保证渲染的实时性。

4  结  论

本文使用FFT构建了深海海浪的网格与法线信息,然后对Gerstner波进行方向上的挤压,通过海水波形并计算水体法线。通过添加光照模型,渲染自然界真实的海面效果。经过对比,本文的渲染方法在真实性和实时性方面效果较好,但渲染效率略低于投影网格法。因此,在渲染效率方面作者将做出深入研究。

参考文献:

[1] FOURNIER A,REEVES W T.A simple model of ocean waves [J].ACM SIGGRAPH Computer Graphics,1986,20(4):75-84.

[2] TESSENDORF J.Simulating ocean water [J].Simulating nature:realistic and interactive techniques,2001,1(2):5.

[3] 童若锋,汪国昭.用于动画的水波造型 [J].计算机学报,1996(8):594-599+642.

[4] 徐迎庆,苏成,李华,等.基于物理模型的流水及波浪模拟 [J].计算机辅助设计与图形学学报,1997(2):96-97.

[5] 唐勇,范福鼎,李颖.近岛海洋场景海水色彩真实感实时绘制 [J].小型微型计算机系统,2016,37(4):847-850.

[6] JESCHKE S,SK?IVAN T,M?LLER-FISCHER M.Water surface wavelets [J].ACM Transactions on Graphics,2018,37(4):742-755.

作者简介:张军鹏(1994—),男,汉族,河南新乡人,硕士研究生在读,研究方向:计算机视觉。

猜你喜欢

海面
海面上的悠悠鸟
海面床,轻轻摇
第六章 邂逅“胖胖号”
暗礁
南非大白鲨跃出海面血盆大口尖齿獠牙捕食
记得
《奇奇避险》等
月夜的海面
独角鲸的“牙”
名人名言