一种基于GPGPU渲染的3D海水的仿真方法和仿真系统与流程

文档序号:12126688阅读:240来源:国知局
一种基于GPGPU渲染的3D海水的仿真方法和仿真系统与流程

本申请涉及数据处理领域,尤其涉及一种基于GPGPU渲染的3D海水的仿真方法和仿真系统。



背景技术:

海水仿真时现在显卡显示的一个难题,由于其的反射、折射、形态变化等,使得海水的仿真非常困难。现有技术在海水仿真时其仿真度不够高,无法实现大海域的实时仿真,海浪的波浪起伏仿真度比较低,运行效率低下等。由于仿真算法不够理想,船只在海上航行没有明显的波浪效果,或者波浪效果通过特效实现的,仿真感比较弱。没有实现类似直升机在海面悬空时海面出现的波纹效果。而且不可以跨平台,只能在单一的平台上运行。



技术实现要素:

有鉴于此,本申请提供了一种基于GPGPU渲染的3D海水的仿真方法和仿真系统,以解决现有技术仿真度不够的问题。

具体地,本申请是通过如下技术方案实现的:

本发明提供了一种基于GPGPU渲染的3D海水的仿真方法,所述仿真方法包括:

通过中央处理器CPU进行初始化,动态生成海面网格;

通过通用计算图形处理器GPGPU进行所述海面网格的并行化运算;

通过所述GPGPU执行3D Kochin算法获取船只在海上航行的轨迹,并计算海水与海岸线的混合效果。

本发明还提供基于一种基于GPGPU渲染的3D海水的仿真系统,所述仿真系统包括:

海面网格生成单元,用于通过中央处理器CPU进行初始化,动态生成海面网格;

并行化运算单元,用于通过通用计算图形处理器GPGPU进行所述海面网格的并行化运算;

轨迹和混合效果计算单元,通过所述GPGPU执行3D Kochin算法获取船只在海上航行的轨迹,并计算海水与海岸线的混合效果。

本发明实施例,将所有的计算和渲染安排在GPGPU中进行,将海水模型计算和渲染在GPGPU中构成一个整体流程,减少内存和显存之间的通信,这样可以充分发挥GPGPU性能,大幅提升仿真效率。通过以上的方法,达到海水、海浪的渲染,反射、折射,船体轨迹的可视化效果真实感和仿真实时性的良好协调。

附图说明

图1是本申请一示例性实施例示出的一种基于GPGPU渲染的3D海水的仿真方法的流程图;

图2是本申请一示例性实施例示出的一种基于GPGPU渲染的3D海水的仿真系统的结构图。

具体实施方式

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。

在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。

应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。

如图1所示为本申请一示例性实施例示出的一种基于GPGPU渲染的3D海水的仿真方法的流程图,所述仿真方法包括:

步骤S101,通过中央处理器CPU进行初始化,动态生成海面网格。

在本发明实施例中,仿真系统首先通过中央处理器CPU进行初始化工作,申请用于的仿真的内存,并动态生成海面网格,其中,初始化包括但不限于:初始化统一计算设备架构CUDA(Compute Unified Device Architecture)设备、申请显存、创建网格海绵、创建VBO、LOD网格生成。

步骤S102,通过通用计算图形处理器GPGPU进行所述海面网格的并行化运算。

在本发明实施例中,仿真系统在动态生成海面网格之后,在GPGPU(General Purpose Graphics Processing Unit,通用计算图形处理器)中进行该海面网格的并行化运算,其中,并行化运算包括但不限于:通过基于FFT的改进算法Gerstner waves方程计算特点时间点的海浪扰动场、通过傅立叶变换和统计波模型计算海浪产生的高度场、计算多个FFT海量边坡矢量波的高度场建模、计算傅立叶振幅波场实现任意波浪的生成、计算雅可比矩阵公式实现模拟浪花、泡沫和飞溅。上述并行化运算的结果将会输出到显存中。

其中,各并行运算具体包括:

(1)、所述通过基于FFT的改进算法Gerstner waves方程计算特点时间点的海浪扰动场,包括:

假设时间t时刻在海水表面的任意一点(x,y)的波动叠加效果,计算公式如下所示:

x=x0-(k/κ)Asin(k·x0-wt)

y=Acos(k·x0-wt)

其中参数k表示的是波向量,是一个波的水平向量。κ表示的是量级,它的计算公式如下所示:

κ=2π/λ

其中λ表示的是波的长度,w表示的是相对于波向量的频率,海浪是起伏不定的,而Gerstner波只是一个单一的正弦波,不能满足实现海水的需求,下面通过迭代公式将其叠加起来公式如下所示:

ki表示的是波向量的集合,Ai表示的是振幅,wi表示的是频率,φi表示的是波的阶段。其中波的起伏行为是由频率wi决定的,其中w0的公式如下所示:

其中T表示的是在海水的某个时刻,wi的频率公式如下所示:

其中是量化的海水色散表面[[]]表示的是取整部分,w(k)表示的是海水的色散关系。它的计算表达式如下所示:

w2(k)=gk(1+k2L2)

其中g表示的是重力常量,L表示的波的单位长度。通过以上公式的计算海浪扰动就形成了。

(2)、所述通过傅立叶变换和统计波模型计算海浪产生的高度场,包括:

所述高度场的计算公式如下所示:

其中t表示的是时间,x=(x,z)表示的是海水网格的水平位置,k是一个二维向量,k=(κxz),其中κx和κz的公式分别表示如下所示:

κx=2πn/Lx

κz=2πm/Lz

参数m,n是整数,它的范围分别为:

-N/2≤n≤N/2,

-M/2≤m≤M/2,

利用FFT算法过程生成高度场的离散点:

x=(nLx/N,mLz/M)。

以上公式完成了统计波模型高度场的计算,接下来求解改进版的菲利普斯波普方程求解高度场:

其中,L=V2/g,参数V表示的是风的速度,g是重力常量,是风的方向,A表示的是数字常量表示的是垂直于风向的移动,其中参数l≤L。

(3)、所述计算多个FFT海量边坡矢量波的高度场建模,包括:

所述高度场建模的计算方程如下所示:

参数Δx表示的是水平分离的2d向量。

(4)、所述计算傅立叶振幅波场实现任意波浪的生成,包括:

现实中的海浪都是随意的毫无规律的,在海浪仿真算法中也需要对其做任意波生成,接下来继续解傅立叶变换方程:

其中参数ξr和ξi表示的是高斯分布随机数,高斯分布随机数倾向于遵循试验——精确海浪数据,当然其他可以使用随机数分布。接下来继续求解方程,在时间t时刻的傅里叶振幅波场实现方程如下所示:

其中表示的波的滚动向左还是向右,最终计算出海浪的高度。通过以上方程就完成了公式的计算,将其运用到海浪的计算就可以产生逼真随意的海浪高度。

(5)、所述计算雅可比矩阵公式实现模拟浪花、泡沫和飞溅,包括:

通过雅可比矩阵信号重叠的波判断其海浪的重叠区域:

J(x)=JxxJyy-JxyJyx

将上述方程分解可得到以下方程式:

其中D=(Dx,Dy),继续求解方程如下所示:

为了方便求解,将上述方程用矩阵的特征值和特征向量表示为如下公式:

其中J-和J+是两个特征值矩阵,和分别对应的是标准正交特征向量。其中

J=J-J+,使用下面的公式计算特征值和特征向量矩阵是最快的,公式如下所示:

其中特征值的计算如下所示:

其中:

步骤S103,通过所述GPGPU执行3D Kochin算法获取船只在海上航行的轨迹,并计算海水与海岸线的混合效果。

在本发明实施例中,在对海面网格进行并行运算之后,即可对船只在海上的航行轨迹进行计算,其具体计算方法如下:假设船只以速度v沿x方向行驶,产生的自由表面波沿着与x轴成α角的方向传播,表面波高表示为:

其中k0=g/v2,g为重力加速度,R为曲线曲率半径,A(α)表示船只参数特征的自由表面波谱,这个可以由Kochin方程求得。船只周围的水流由船的中心平面分布的源产生,源的强度与船体的局部斜度成正比。源强的表达式为:

其中f(x,z)为表示船体参数的方程。对于远场的尾迹,在上面的公式中A(α)表达式如下所示:

上式中,H(k0,α)为Kochin方程:

其中船体的模型是函数f(x,z)可以简化模型的计算,再通过以上公式递推出ζ(x,y),从而解出3D开尔文方程。

需要指出的是,船体在海中航行会有飞溅的水花以及航行轨迹,以及船体会随海浪上下浮动,其代码实现如下所示:

WakeGeneratorParameters parameters;//产生浪花飞溅结构体

parameters.sprayEffects=true;//是否产生

parameters.bowSprayOffset=100.0;//轨迹产生的便宜值

parameters.beamWidth=20.0;//轨迹宽度

parameters.length=100.0;//轨迹的长度

//产生船体轨迹

WakeGenerator*ship=new WakeGenerator(ocean,parameters);

需要在程序中每帧更新,更新函数如下所示:

ship->Update(Vector3(shipX,shipY,shipZ),shipDirection,shipVelocity,now);

参数shipX、shipY、shipZ表示船体的位置,shipDirection表示船体航行方向,shipVelocity船体航行速度,now是否渲染。

同时,船体在海水中航行的粒子轨迹通过GPGPU动态渲染,渲染代码如下:

vec4 color=texColor*mix(vec4(fogColor,1.0),lightColor,fogFactor)*decay*transparency;

其中texColor是通过函数vec4 texColor=texture(particleTexture,tex);得到的,其中particleTexture是粒子纹理,tex是gl_PointCoord点坐标,fogColor是雾效颜色,lightColor是灯光颜色,fogFactor是雾效系数,decay是贴花系数,它是通过代码float decay=clamp(exp(-2.0*elapsed)*2.0*sin(3.0*elapsed),0.0,1.0);获取到的,elased表示时间,transparency表示的是透明系数。其中mix是GLSL是语言内建的混合函数。clamp是GLSL插值函数,texture是纹理取样函数。

本发明实施例,将所有的计算和渲染安排在GPGPU中进行,将海水模型计算和渲染在GPGPU中构成一个整体流程,减少内存和显存之间的通信,这样可以充分发挥GPGPU性能,大幅提升仿真效率。通过以上的方法,达到海水、海浪的渲染,反射、折射,船体轨迹的可视化效果真实感和仿真实时性的良好协调。

作为本发明的一个可选实施例,所述仿真方法还包括以下步骤:

通过所述GPGPU渲染海水的反射效果和折射效果。

在本发明实施例中,真实的海水中还包括反射效果和折射效果,该反射效果和折射效果通常通过GPGPU运行菲涅尔算法实现。

作为本发明的一个可选实施例,所述仿真方法还包括以下步骤:

通过所述GPGPU使用3D贴花原理渲染海水表层的漂浮物。

在本发明实施例中,海水中往往还包括各种漂浮物,如:油污等,可以通过GPGPU使用3D贴花原理渲染海水表层的漂浮物。

如图2所示为本申请一示例性实施例示出的一种基于GPGPU渲染的3D海水的仿真系统的结构图,所述仿真系统,包括:

海面网格生成单元201,用于通过中央处理器CPU进行初始化,动态生成海面网格。

在本发明实施例中,海面网格生成单元201首先通过中央处理器CPU进行初始化工作,申请用于的仿真的内存,并动态生成海面网格,其中,初始化包括但不限于:初始化统一计算设备架构CUDA(Compute Unified Device Architecture)设备、申请显存、创建网格海绵、创建VBO、LOD网格生成。

并行化运算单元202,用于通过通用计算图形处理器GPGPU进行所述海面网格的并行化运算。

在本发明实施例中,仿真系统在动态生成海面网格之后,并行化运算单元202控制GPGPU(General Purpose Graphics Processing Unit,通用计算图形处理器)进行该海面网格的并行化运算,其中,并行化运算包括但不限于:通过基于FFT的改进算法Gerstner waves方程计算特点时间点的海浪扰动场、通过傅立叶变换和统计波模型计算海浪产生的高度场、计算多个FFT海量边坡矢量波的高度场建模、计算傅立叶振幅波场实现任意波浪的生成、计算雅可比矩阵公式实现模拟浪花、泡沫和飞溅。上述并行化运算的结果将会输出到显存中。

其中,各并行运算包括:

(1)、所述通过基于FFT的改进算法Gerstner waves方程计算特点时间点的海浪扰动场,包括:

假设时间t时刻在海水表面的任意一点(x,y)的波动叠加效果,计算公式如下所示:

x=x0-(k/κ)Asin(k·x0-wt)

y=Acos(k·x0-wt)

其中参数k表示的是波向量,是一个波的水平向量。κ表示的是量级,它的计算公式如下所示:

κ=2π/λ

其中λ表示的是波的长度,w表示的是相对于波向量的频率,海浪是起伏不定的,而Gerstner波只是一个单一的正弦波,不能满足实现海水的需求,下面通过迭代公式将其叠加起来公式如下所示:

ki表示的是波向量的集合,Ai表示的是振幅,wi表示的是频率,φi表示的是波的阶段。其中波的起伏行为是由频率wi决定的,其中w0的公式如下所示:

其中T表示的是在海水的某个时刻,wi的频率公式如下所示:

其中是量化的海水色散表面[[]]表示的是取整部分,w(k)表示的是海水的色散关系。它的计算表达式如下所示:

w2(k)=gk(1+k2L2)

其中g表示的是重力常量,L表示的波的单位长度。通过以上公式的计算海浪扰动就形成了。

(2)、所述通过傅立叶变换和统计波模型计算海浪产生的高度场,包括:

所述高度场的计算公式如下所示:

其中t表示的是时间,x=(x,z)表示的是海水网格的水平位置,k是一个二维向量,k=(κxz),其中κx和κz的公式分别表示如下所示:

κx=2πn/Lx

κz=2πm/Lz

参数m,n是整数,它的范围分别为:

-N/2≤n≤N/2,

-M/2≤m≤M/2,

利用FFT算法过程生成高度场的离散点:

x=(nLx/N,mLz/M)。

以上公式完成了统计波模型高度场的计算,接下来求解改进版的菲利普斯波普方程求解高度场:

其中,L=V2/g,参数V表示的是风的速度,g是重力常量,是风的方向,A表示的是数字常量表示的是垂直于风向的移动,其中参数l≤L。

(3)、所述计算多个FFT海量边坡矢量波的高度场建模,包括:

所述高度场建模的计算方程如下所示:

参数Δx表示的是水平分离的2d向量。

(4)、所述计算傅立叶振幅波场实现任意波浪的生成,包括:

现实中的海浪都是随意的毫无规律的,在海浪仿真算法中也需要对其做任意波生成,接下来继续解傅立叶变换方程:

其中参数ξr和ξi表示的是高斯分布随机数,高斯分布随机数倾向于遵循试验——精确海浪数据,当然其他可以使用随机数分布。接下来继续求解方程,在时间t时刻的傅里叶振幅波场实现方程如下所示:

其中表示的波的滚动向左还是向右,最终计算出海浪的高度。通过以上方程就完成了公式的计算,将其运用到海浪的计算就可以产生逼真随意的海浪高度。

(5)、所述计算雅可比矩阵公式实现模拟浪花、泡沫和飞溅,包括:

通过雅可比矩阵信号重叠的波判断其海浪的重叠区域:

J(x)=JxxJyy-JxyJyx

将上述方程分解可得到以下方程式:

其中D=(Dx,Dy),继续求解方程如下所示:

为了方便求解,将上述方程用矩阵的特征值和特征向量表示为如下公式:

其中J-和J+是两个特征值矩阵,和分别对应的是标准正交特征向量。其中

J=J-J+,使用下面的公式计算特征值和特征向量矩阵是最快的,公式如下所示:

其中特征值的计算如下所示:

其中:

轨迹和混合效果计算单元203,通过所述GPGPU执行3D Kochin算法获取船只在海上航行的轨迹,并计算海水与海岸线的混合效果。

在本发明实施例中,在对海面网格进行并行运算之后,轨迹和混合效果计算单元203、对船只在海上的航行轨迹进行计算,其具体计算方法如下:假设船只以速度v沿x方向行驶,产生的自由表面波沿着与x轴成α角的方向传播,表面波高表示为:

其中k0=g/v2,g为重力加速度,R为曲线曲率半径,A(α)表示船只参数特征的自由表面波谱,这个可以由Kochin方程求得。船只周围的水流由船的中心平面分布的源产生,源的强度与船体的局部斜度成正比。源强的表达式为:

其中f(x,z)为表示船体参数的方程。对于远场的尾迹,在上面的公式中A(α)表达式如下所示:

上式中,H(k0,α)为Kochin方程:

其中船体的模型是函数f(x,z)可以简化模型的计算,再通过以上公式递推出ζ(x,y),从而解出3D开尔文方程。

需要指出的是,船体在海中航行会有飞溅的水花以及航行轨迹,以及船体会随海浪上下浮动,其代码实现如下所示:

WakeGeneratorParameters parameters;//产生浪花飞溅结构体

parameters.sprayEffects=true;//是否产生

parameters.bowSprayOffset=100.0;//轨迹产生的便宜值

parameters.beamWidth=20.0;//轨迹宽度

parameters.length=100.0;//轨迹的长度

//产生船体轨迹

WakeGenerator*ship=new WakeGenerator(ocean,parameters);

需要在程序中每帧更新,更新函数如下所示:

ship->Update(Vector3(shipX,shipY,shipZ),shipDirection,shipVelocity,now);

参数shipX、shipY、shipZ表示船体的位置,shipDirection表示船体航行方向,shipVelocity船体航行速度,now是否渲染。

同时,船体在海水中航行的粒子轨迹通过GPGPU动态渲染,渲染代码如下:

vec4 color=texColor*mix(vec4(fogColor,1.0),lightColor,fogFactor)*decay*transparency;

其中texColor是通过函数vec4 texColor=texture(particleTexture,tex);得到的,其中particleTexture是粒子纹理,tex是gl_PointCoord点坐标,fogColor是雾效颜色,lightColor是灯光颜色,fogFactor是雾效系数,decay是贴花系数,它是通过代码float decay=clamp(exp(-2.0*elapsed)*2.0*sin(3.0*elapsed),0.0,1.0);获取到的,elased表示时间,transparency表示的是透明系数。其中mix是GLSL是语言内建的混合函数。clamp是GLSL插值函数,texture是纹理取样函数。

本发明实施例,将所有的计算和渲染安排在GPGPU中进行,将海水模型计算和渲染在GPGPU中构成一个整体流程,减少内存和显存之间的通信,这样可以充分发挥GPGPU性能,大幅提升仿真效率。通过以上的方法,达到海水、海浪的渲染,反射、折射,船体轨迹的可视化效果真实感和仿真实时性的良好协调。

作为本发明的一个可选实施例,所述仿真系统还包括:

反射和折射效果渲染单元,用于通过所述GPGPU渲染海水的反射效果和折射效果。

在本发明实施例中,真实的海水中还包括反射效果和折射效果,该反射效果和折射效果通常通过GPGPU运行菲涅尔算法实现。

作为本发明的另一个可选实施例,所述仿真系统还包括:

漂浮物渲染单元,用于通过所述GPGPU使用3D贴花原理渲染海水表层的漂浮物。

在本发明实施例中,海水中往往还包括各种漂浮物,如:油污等,可以通过GPGPU使用3D贴花原理渲染海水表层的漂浮物。

以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1