一种基于GPU的三维流体模拟方法转让专利

申请号 : CN201110325105.0

文献号 : CN102402791B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 郭华

申请人 : 克拉玛依红有软件有限责任公司

摘要 :

本发明提供了一种基于GPU的三维流体模拟方法,包括:采集三维流体的数据信息并进行存储,获得三维流体的数据信息;CPU对获得的三维流体的数据信息进行预处理操作,获得预处理的预处理结果GPU对获得的三维流体的数据信息进行流体模拟,获得三维流体的数据信息的流体模拟结果;将所获得的三维流体的数据信息的流体模拟结果进行渲染,获得渲染后的三维流体的数据信息的流体模拟结果;该方法可以实现对三维流体模拟过程的简单及实时操作。

权利要求 :

1.一种基于GPU的三维流体模拟方法,其特征在于,包括:采集三维流体的数据信息并进行存储,获得三维流体的数据信息;

CPU对获得的三维流体的数据信息进行预处理操作,获得预处理的预处理结果;

GPU对获得的三维流体的数据信息进行流体模拟,获得三维流体的数据信息的流体模拟结果;

将所获得的三维流体的数据信息的流体模拟结果进行渲染,获得渲染后的三维流体的数据信息的流体模拟结果;

所述GPU对获得的三维流体的数据信息进行流体模拟,获得三维流体的数据信息的流体模拟结果的步骤,包括:GPU对获得的三维流体的数据信息进行数据更新过程,获得更新的三维流体的数据信息;

对更新的三维流体的数据信息进行流体模拟,获得三维流体的数据信息的流体模拟结果;

所述GPU对获得的三维流体的数据信息进行数据更新过程,获得更新的三维流体的数据信息的步骤,包括:计算每个粒子处的浓度,获得每个粒子处的浓度;

计算每个粒子的力及颜色场值,获得每个粒子的力及每个粒子的颜色场值;

移动粒子并清空粒子的相关场,获得更新的三维流体的数据信息;

所述计算每个粒子处的浓度,获得每个粒子处的浓度的步骤,包括:采用基于切片的计算方式,将每个粒子处的浓度进行扩散处理,获得相应的每个片元的每个粒子处的浓度;

所述采用基于切片的计算方式,将每个粒子处的浓度进行扩散处理,获得相应的每个片元的每个粒子处的浓度的步骤,包括:依据影响因素,确定体浓度纹理中粒子影响的切片个数;

为每个被影响切片构造一个相应的被影响区域的四边形,获得每个被影响切片相应的被影响区域的四边形;

依据对应关系,把每个四边形光栅化到相应的被影响的切片上,获得相应的片元;

对于每个片元,计算每个粒子处与片元粒子中心的距离,获得每个粒子处与片元粒子中心的距离数值;

依据SPH浓度方程,由每个粒子处与片元粒子中心的距离数值,计算每个粒子处的浓度,获得相应的每个片元的每个粒子处的浓度。

2.如权利要求1所述的方法,其特征在于,所述CPU对获得的三维流体的数据信息进行预处理操作,获得预处理的预处理结果的步骤,包括:将流体离散为平滑粒子流体动力学SPH的粒子;

设置平滑粒子流体动力学SPH的粒子的初始属性值;其中,所述平滑粒子流体动力学SPH的粒子的初始属性值为位置数值、半径数值、质量数值及流体的剩余密度数值;

对边界及障碍物的三角面片进行细分;

把初始化数据传入GPU的显存或纹理单元中,完成CPU对获得的三维流体的数据信息进行预处理操作的全过程。

3.如权利要求1所述的方法,其特征在于,所述采用基于切片的计算方式的步骤,包括:采用世界空间的粒子位置及世界空间的粒子位置的浓度去填充顶点缓存,获得存储有世界空间的粒子位置及世界空间的粒子位置的浓度的顶点缓存;

将体纹理设置为渲染目标,对顶点缓存中的数据进行渲染;

将每个包含SPH浓度方程的一维纹理设置为shader程序中的输入全局变量,获得含有全局变量的一维纹理;

采用含有全局变量的一维纹理,通过纹理查询来计算片元的浓度,获得片元的浓度。

4.如权利要求1所述的方法,其特征在于,所述采用基于切片的计算方式的步骤,包括:通过顶点着色器完成顶点着色器代码中的计算过程,获得顶点着色器的计算结果;

通过几何着色器完成几何着色器代码中的计算过程,获得几何着色器的计算结果;

通过像素着色器采用光线投射算法的方法来完成像素着色器代码中的计算过程,获得像素着色器的计算结果。

5.如权利要求4所述的方法,其特征在于,所述通过顶点着色器完成顶点着色器代码中的计算过程,获得顶点着色器的计算结果的步骤,包括:采用实例id和粒子位置的z分量来计算三维纹理里渲染目标的切片下标,获得三维纹理里渲染目标的切片下标;

把x、y分量从世界空间变换到归一化设备空间;

计算粒子位置到渲染目标切片的偏移,获得片元和粒子之间距离的数值。

6.如权利要求4所述的方法,其特征在于,所述通过几何着色器完成几何着色器代码中的计算过程,获得几何着色器的计算结果的步骤,包括:验证计算获得的渲染目标切片下标;

渲染目标切片下标在有效范围内,生成四个输出顶点并连接成为两个三角形带,获得渲染目标切片下标的四边形;

其中,所述每个输出顶点的属性为输出顶点的体切片下标、输出顶点的粒子浓度、输出顶点的顶点位置及输出顶点的三维纹理坐标。

7.如权利要求4所述的方法,其特征在于,所述通过像素着色器采用光线投射算法的方法来完成像素着色器代码中的计算过程,获得像素着色器的计算结果的步骤,包括:通过属性的插值及像素着色器来计算纹理坐标矢量的长度,获得纹理坐标矢量的长度;

将纹理坐标矢量的长度作为浓度方程的纹理的纹理坐标,获得浓度方程的纹理的纹理坐标;

采样值乘以粒子浓度,获得采样纹理坐标的浓度;

采用加性混合方法加到渲染目标的已知值上来进行渲染,获得采样纹理坐标的渲染后浓度。

8.如权利要求7所述的方法,其特征在于,所述通过像素着色器采用光线投射算法的方法来完成像素着色器代码中的计算过程,获得像素着色器的计算结果的步骤,包括:在光线投射算法的初始化阶段,创建两个纹理,获得初始化的两个纹理;

在光线投射算法的循环阶段,在一次循环过程中,分别渲染表示体边界的后向面及前向面,获得纹理空间的射线方向和长度;当一次循环过程结束后,沿纹理空间的射线方向计算采样点,采样体纹理的数据信息并将采样点的采样值进行累加,获得像素着色器的计算结果。

9.如权利要求8所述的方法,其特征在于,所述在一次循环过程中,分别渲染表示体边界的后向面及前向面,获得纹理空间的射线方向和长度的步骤,包括:开始渲染表示体边界的包围盒的后向面;采用光栅化器来插值包围盒顶点的纹理空间坐标,获得插值后的包围盒顶点的纹理空间坐标;通过像素着色器将插值后的包围盒顶点的纹理空间坐标送到渲染目标中,获得包围盒的前向面的渲染目标的值;其中,通过包围盒的光栅化的方式来创建片元,获得为生成与体相交的射线的像素的片元;

开始渲染包围盒的前向面;采用光栅化器来插值包围盒顶点的纹理空间坐标,获得插值后的包围盒顶点的纹理空间坐标;通过像素着色器将插值后的包围盒顶点的纹理空间坐标送到渲染目标中,获得包围盒的前向面的渲染目标的值;其中,通过包围盒的光栅化的方式来创建片元,获得为生成与体相交的射线的像素的片元;

激活的像素着色器采用片元的归一化设备坐标来采样包围盒的前向面的渲染目标的值及包围盒的后向面的渲染目标的值,获得每次采样的相应的渲染目标的值;

通过每次采样的相应的渲染目标的值来计算纹理空间的射线方向和长度,获得每次采用的纹理空间的射线方向和长度。

说明书 :

一种基于GPU的三维流体模拟方法

技术领域

[0001] 本发明涉及计算机图形学领域,特别是涉及一种基于GPU的三维流体模拟方法。

背景技术

[0002] 流体模拟是计算机图形学和动画的一个非常重要的技术,逼真的流体将为用户带来更真实的体验。但流体的模拟很困难,因为正确的模拟流体行为,所述模拟流体行为包括对流,扩散,湍流及表面张力的模拟是很复杂的。
[0003] 流体模拟通常有两种方法:基于网格的流体模拟方法和基于粒子的流体模拟方法。
[0004] 下面详细介绍基于网格的流体模拟方法和基于粒子的流体模拟方法。
[0005] 1)基于网络的流体模拟方法是把流体堪称是连续的,而把空间区域离散成网格,再使用有限差分法即欧拉模型来实现基于网格的流体模拟的全过程。
[0006] 基于网格的流体模拟的方法的优点是:可行性,是一个可以操作的方法;
[0007] 基于网格的流体模拟的方法的缺点是:采用基于网格的流体模拟的方法对流,扩散,湍流及表面张力的模拟过程中需要计算的强度大,而且整个模拟过程不能逼真的模拟例如模拟空间有界的一些模拟效果。
[0008] 2)基于粒子的流体模拟方法所采用的模型为拉格朗日模型,是把流体表示成一组离散的例子,通过求解粒子动力学来模拟整个流体运动的全过程。
[0009] 基于粒子的流体模拟方法的优点是:采用基于粒子的流体模拟方法对流,扩散,湍流及表面张力的模拟过程中涉及到的计算更加简单,而且整个模拟过程中的表面重建更容易,流体可以在空间自由扩散。
[0010] 目前被广泛采用的基于粒子的流体模拟方法是光滑粒子流体动力学(SPH)方法,SPH是一种求解偏微分方程的数值方法,属于无网格法的一种。由于SPH方法彻底摆脱了计算网格的约束,采用任意分布的粒子来表示求解域,不会遇到网格变形过大或网格畸变的问题,所以特别适合求解冲击动力学中的大变形问题。同时由于SPH法是具有拉格朗日性质的动力学方法,所以可以方便的跟踪物质的运动轨迹,适合描述流体界面的大变形运动过程以及流体与固体之间的相互作用。SPH方法作为一种具有无网格、自适应、稳定以及拉格朗日性质的动力学求解算法,已经成为冲击动力学研究的一个热点问题,并在工程实践中有着广泛的应用前景。
[0011] SPH方法是把流体分为一组离散的粒子,粒子之间有空间距离,粒子的属性在这个空间距离上使用内核函数来平滑。所有粒子的物理量可以通过累加在一定范围内的所有粒子的相关属性来获得。粒子的物理量及其空间导数通过搜索光滑半径内与其相互作用的粒子的物理量进行插值得到。这样就简化了流体力学偏微分方程组的求解过程,与传统的流体模拟方法相比,采用SPH算法得到的模拟结果不仅可以真实的模拟流体流动的效果,还能实现流体表面的剧烈变形,甚至表面破碎,如浪花飞溅效果都可以逼真的模拟出来。
[0012] 传统的SPH算法本身还存在着边界粒子计算精度低和张力不稳定的固有缺陷。
[0013] SPH方法的更新过程是通过粒子模拟流体的运动规律来完成的,但这仅仅是完成了一个粒子系统的模拟,模拟后的结果还仅仅是一堆水粒子,还需要对模拟得到的模拟结果进行渲染。目前常见的渲染方法采用了基于点精灵的直接粒子渲染方法及基于等值面抽取(marching cube)的表面渲染方法。下面分别介绍两种常见的渲染方法,具体如下所述:
[0014] 1)基于点精灵的直接渲染方法
[0015] 首先在模拟中实现粒子的运动,然后渲染所有的粒子。这种方法的缺点是不易实现。
[0016] 2)基于等值面抽取(marching cube)的表面渲染方法
[0017] 基于等值面抽取(marching cube)的表面渲染方法所涉及的算法完全在CPU上执行,从离散体密度场直接构建等值面的三角形网格。这种方法的优点是简单且容易实现;缺点是效率很低。
[0018] 因而,目前需要本领域技术人员迫切解决的一个技术问题就是:如何找到一种新型的三维流体模拟方法,该方法是实现对三维流体模拟过程的简单及实时操作。

发明内容

[0019] 本发明所要解决的一个技术问题是提供一种基于GPU的三维流体模拟方法,该方法可以实现对三维流体模拟过程的简单及实时操作。
[0020] 为了解决上述问题,本发明公开了一种基于GPU的三维流体模拟方法,包括:
[0021] 采集三维流体的数据信息并进行存储,获得三维流体的数据信息;
[0022] CPU对获得的三维流体的数据信息进行预处理操作,获得预处理的预处理结果;
[0023] GPU对获得的三维流体的数据信息进行流体模拟,获得三维流体的数据信息的流体模拟结果;
[0024] 将所获得的三维流体的数据信息的流体模拟结果进行渲染,获得渲染后的三维流体的数据信息的流体模拟结果。
[0025] 优选的,所述CPU对获得的三维流体的数据信息进行预处理操作,获得预处理的预处理结果的步骤,包括:
[0026] 将流体离散为平滑粒子流体动力学SPH的粒子;
[0027] 设置平滑粒子流体动力学SPH的粒子的初始属性值;其中,所述平滑粒子流体动力学SPH的粒子的初始属性值为位置数值、半径数值、质量数值及流体的剩余密度数值;
[0028] 对边界及障碍物的三角面片进行细分;
[0029] 把初始化数据传入GPU的显存或纹理单元中,完成CPU对获得的三维流体的数据信息进行预处理操作的全过程。
[0030] 优选的,所述GPU对获得的三维流体的数据信息进行流体模拟,获得三维流体的数据信息的流体模拟结果的步骤,包括:
[0031] GPU对获得的三维流体的数据信息进行数据更新过程,获得更新的三维流体的数据信息;
[0032] 对更新的三维流体的数据信息进行流体模拟,获得三维流体的数据信息的流体模拟结果。
[0033] 优选的,所述GPU对获得的三维流体的数据信息进行数据更新过程,获得更新的三维流体的数据信息的步骤,包括:
[0034] 计算每个粒子处的浓度,获得每个粒子处的浓度;
[0035] 计算每个粒子的力及颜色场值,获得每个粒子的力及每个粒子的颜色场值;
[0036] 移动粒子并清空粒子的相关场,获得更新的三维流体的数据信息。
[0037] 优选的,所述计算每个粒子处的浓度,获得每个粒子处的浓度的步骤,包括:
[0038] 采用基于切片的计算方式,将每个粒子处的浓度进行扩散处理,获得相应的每个片元的每个粒子处的浓度。
[0039] 优选的,所述采用基于切片的计算方式,将每个粒子处的浓度进行扩散处理,获得相应的每个片元的每个粒子处的浓度的步骤,包括:
[0040] 依据影响因素,确定体浓度纹理中粒子影响的切片个数;
[0041] 为每个被影响切片构造一个相应的被影响区域的四边形,获得每个被影响切片相应的被影响区域的四边形;
[0042] 依据对应关系,把每个四边形光栅化到相应的被影响的切片上;获得相应的片元;
[0043] 对于每个片元,计算每个粒子处与片元粒子中心的距离,获得每个粒子处与片元粒子中心的距离数值;
[0044] 依据SPH浓度方程,由每个粒子处与片元粒子中心的距离数值,计算每个粒子处的浓度,获得相应的每个片元的每个粒子处的浓度。
[0045] 优选的,所述采用基于切片的计算方式的步骤,包括:
[0046] 采用世界空间的粒子位置及世界空间的粒子位置的浓度去填充顶点缓存,获得存储有世界空间的粒子位置及世界空间的粒子位置的浓度的顶点缓存;
[0047] 将体纹理设置为渲染目标,对顶点缓存中的数据进行渲染;
[0048] 将每个包含SPH浓度方程的一维纹理设置为shader程序中的输入全局变量,获得含有全局变量的一维纹理;
[0049] 采用含有全局变量的一维纹理,通过纹理查询来计算片元的浓度,获得片元的浓度。
[0050] 优选的,所述采用基于切片的计算方式的步骤,包括:
[0051] 通过顶点着色器完成顶点着色器代码中的计算过程,获得顶点着色器的计算结果;
[0052] 通过几何着色器完成几何着色器代码中的计算过程,获得几何着色器的计算结果;
[0053] 通过像素着色器采用光线投射算法的方法来完成像素着色器代码中的计算过程,获得像素着色器的计算结果。
[0054] 优选的,所述通过顶点着色器完成顶点着色器代码中的计算过程,获得顶点着色器的计算结果的步骤,包括:
[0055] 采用实例id和粒子位置的z分量来计算三维纹理里渲染目标的切片下标,获得三维纹理里渲染目标的切片下标;
[0056] 把x、y分量从世界空间变换到归一化设备空间;
[0057] 计算粒子位置到渲染目标切片的偏移,获得片元和粒子之间距离的数值。
[0058] 优选的,所述通过几何着色器完成几何着色器代码中的计算过程,获得几何着色器的计算结果的步骤,包括:
[0059] 验证计算获得的渲染目标切片下标;
[0060] 渲染目标切片下标在有效范围内,生成四个输出顶点并连接成为两个三角形带,获得渲染目标切片下标的四边形;
[0061] 其中,所述每个输出顶点的属性为输出顶点的体切片下标、输出顶点的粒子浓度、输出顶点的顶点位置及输出顶点的三维纹理坐标。
[0062] 优选的,所述通过像素着色器采用光线投射算法的方法来完成像素着色器代码中的计算过程,获得像素着色器的计算结果的步骤,包括:
[0063] 通过属性的插值及像素着色器来计算纹理坐标矢量的长度,获得纹理坐标矢量的长度;
[0064] 将纹理坐标矢量的长度作为浓度方程的纹理的纹理坐标,获得浓度方程的纹理的纹理坐标;
[0065] 采样值乘以粒子浓度,获得采样纹理坐标的浓度;
[0066] 采用加性混合方法加到渲染目标的已知值上来进行渲染,获得采样纹理坐标的渲染后浓度。
[0067] 优选的,所述通过像素着色器采用光线投射算法的方法来完成像素着色器代码中的计算过程,获得像素着色器的计算结果的步骤,包括:
[0068] 在光线投射算法的初始化阶段,创建两个纹理,获得初始化的两个纹理;
[0069] 在光线投射算法的循环阶段,在一次循环过程中,分别渲染表示体边界的后向面及前向面,获得纹理空间的射线方向和长度;当一次循环过程结束后,沿纹理空间的射线方向计算采样点,采样体纹理的数据信息并将采样点的采样值进行累加,获得像素着色器的计算结果。
[0070] 优选的,所述在一次循环过程中,分别渲染表示体边界的后向面及前向面,获得纹理空间的射线方向和长度的步骤,包括:
[0071] 开始渲染表示体边界的包围盒的后向面;采用光栅化器来插值包围盒顶点的纹理空间坐标,获得插值后的包围盒顶点的纹理空间坐标;通过像素着色器将插值后的包围盒顶点的纹理空间坐标送到渲染目标中,获得包围盒的前向面的渲染目标的值;其中,通过包围盒的光栅化的方式来创建片元,获得为生成与体相交的射线的像素的片元;
[0072] 开始渲染包围盒的前向面;采用光栅化器来插值包围盒顶点的纹理空间坐标,获得插值后的包围盒顶点的纹理空间坐标;通过像素着色器将插值后的包围盒顶点的纹理空间坐标送到渲染目标中,获得包围盒的前向面的渲染目标的值;其中,通过包围盒的光栅化的方式来创建片元,获得为生成与体相交的射线的像素的片元;
[0073] 激活的像素着色器采用片元的归一化设备坐标来采样包围盒的前向面的渲染目标的值及包围盒的后向面的渲染目标的值,获得每次采样的相应的渲染目标的值;
[0074] 通过每次采样的相应的渲染目标的值来计算纹理空间的射线方向和长度,获得每次采用的纹理空间的射线方向和长度。
[0075] 本发明显著优点在于:
[0076] 该发明可以实现对三维流体模拟过程中满足实时环境的需要。
[0077] 总之,本发明提供一种基于GPU的三维流体模拟方法,该方法可以实现对三维流体模拟过程的简单及实时操作。

附图说明

[0078] 图1是本发明一种基于GPU的三维流体模拟方法的实施例的步骤流程图;
[0079] 图2是本发明基于切片的算法的结构示意图;
[0080] 图3是本发明基于切片的算法的图创建切片索引结构示意图;
[0081] 图4是本发明中光线投射算法的创建射线的示意图;
[0082] 图5是本发明中光线投射算法的沿射线采样示意图;
[0083] 图6是本发明中像素着色器的光线投射算法中的光线跟踪起始点的示意图。

具体实施方式

[0084] 为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
[0085] 本发明核心思想之一是提供了一种基于GPU(Graphic Processing Unit中文翻译为“GPU”,GPU是相对于CPU的一个概念,由于在现代的计算机中,特别是家用系统,游戏的发烧友,图形的处理变得越来越重要,需要一个专门的图形的核心处理器)的三维流体模拟方法,包括:采集三维流体的数据信息并进行存储,获得三维流体的数据信息;CPU(Central Processing Unit,中文翻译为中央处理器,是一台计算机的运算核心和控制核心,其功能主要是解释计算机指令以及处理计算机软件中的数据,CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成)对获得的三维流体的数据信息进行预处理操作,获得预处理的预处理结果;GPU对获得的三维流体的数据信息进行流体模拟,获得三维流体的数据信息的流体模拟结果;将所获得的三维流体的数据信息的流体模拟结果进行渲染,获得渲染后的三维流体的数据信息的流体模拟结果;该方法可以实现对三维流体模拟过程的简单及实时操作。
[0086] 本发明可以使用GUP来实现对三维流体进行模拟的原因如下:
[0087] 可以使用CPU来生成体纹理的数据,但是,在实现流体模拟循环时,每一帧更新完成之后,体纹理内的场数据必须重新生成。当仿真运行的时候,每一帧都要进行这样的步骤。这样,为体纹理填充数据的过程将对整体性能产生很大的影响。但因为这个算法是高度并行的,所以可以使用GPU来实现。
[0088] 参照图1,示出了本发明一种基于GPU的三维流体模拟方法的实施例的步骤流程图,具体可以包括:
[0089] 步骤101、采集三维流体的数据信息并进行存储,获得三维流体的数据信息。
[0090] 步骤102、CPU对获得的三维流体的数据信息进行预处理操作,获得预处理的预处理结果。
[0091] 为了使本领域的技术人员更好地理解本发明,在本发明的一个优选实施例中,所述步骤102,具体可以包括:
[0092] 子步骤A1、将流体离散为平滑粒子流体动力学SPH的粒子。
[0093] 子步骤A2、设置平滑粒子流体动力学SPH的粒子的初始属性值;其中,所述平滑粒子流体动力学SPH的粒子的初始属性值为位置数值、半径数值、质量数值及流体的剩余密度数值。
[0094] 子步骤A3、对边界及障碍物的三角面片进行细分。
[0095] 子步骤A4、把初始化数据传入GPU的显存或纹理单元中,完成CPU对获得的三维流体的数据信息进行预处理操作的全过程。
[0096] 步骤103、GPU对获得的三维流体的数据信息进行流体模拟,获得三维流体的数据信息的流体模拟结果。
[0097] 为了使本领域的技术人员更好地理解本发明,在本发明的另一个优选实施例中,所述步骤103,具体可以包括:
[0098] 子步骤B1、GPU对获得的三维流体的数据信息进行数据更新过程,获得更新的三维流体的数据信息。
[0099] 子步骤B2、对更新的三维流体的数据信息进行流体模拟,获得三维流体的数据信息的流体模拟结果。
[0100] 为了使本领域的技术人员更好地理解本发明,在本发明的另一个优选实施例中,所述步骤103,具体可以包括:
[0101] 子步骤C1、计算每个粒子处的浓度,获得每个粒子处的浓度。
[0102] 其中,所述子步骤C1具体可以包括:
[0103] 子步骤D1、采用基于切片的计算方式,将每个粒子处的浓度进行扩散处理,获得相应的每个片元的每个粒子处的浓度。
[0104] 其中,所述子步骤D1具体可以包括:
[0105] 子步骤E1、依据影响因素,确定体浓度纹理中粒子影响的切片个数。
[0106] 子步骤E2、为每个被影响切片构造一个相应的被影响区域的四边形,获得每个被影响切片相应的被影响区域的四边形。
[0107] 子步骤E3、依据对应关系,把每个四边形光栅化到相应的被影响的切片上;获得相应的片元。
[0108] 子步骤E4、对于每个片元,计算每个粒子处与片元粒子中心的距离,获得每个粒子处与片元粒子中心的距离数值。
[0109] 子步骤E5、依据SPH浓度方程,由每个粒子处与片元粒子中心的距离数值,计算每个粒子处的浓度,获得相应的每个片元的每个粒子处的浓度。
[0110] 其中,所述采用基于切片的计算方式的步骤,包括:
[0111] 子步骤F1、采用世界空间的粒子位置及世界空间的粒子位置的浓度去填充顶点缓存,获得存储有世界空间的粒子位置及世界空间的粒子位置的浓度的顶点缓存。
[0112] 子步骤F2、将体纹理设置为渲染目标,对顶点缓存中的数据进行渲染。
[0113] 子步骤F3、将每个包含SPH浓度方程的一维纹理设置为shader程序中的输入全局变量,获得含有全局变量的一维纹理。
[0114] 子步骤F4、采用含有全局变量的一维纹理,通过纹理查询来计算片元的浓度,获得片元的浓度。
[0115] 参照图2,示出了本发明基于切片的算法的结构示意图。
[0116] 从图2,可以看出基于切片的算法的全过程。
[0117] 下面详细介绍基于切片的算法的基本原理及算法的实现过程。
[0118] 1)基于切片的算法的基本原理
[0119] 根据Direct3D10的渲染流水线架构,提出下面基于切片的算法,用于体纹理中单个粒子浓度的扩散。算法的主要步骤如下。
[0120] a)确定体浓度纹理中粒子影响的切片个数
[0121] b)为每个被影响切片构造一个被影响区域的四边形
[0122] c)把这个四边形光栅化到正确的切片上
[0123] d)对于每个片元,检查与粒子中心的距离,从SPH浓度方程计算浓度[0124] 2)基于切片的算法的实现过程如下所述:
[0125] 下面介绍基于Direct3D10算法的实现步骤:首先,使用世界空间的粒子位置和这些位置的浓度填充顶点缓存(四个分量的向量);然后把体纹理设置为渲染目标,渲染顶点缓存中的数据。另外,把一个包含SPH浓度方程的一维纹理,设置为shader程序的输入全局变量。使用这个纹理,可以通过一个简单的纹理查询来计算片元的浓度(用与粒子的距离作为纹理坐标),纹理的采样值再乘以粒子位置的浓度就是片元的浓度。这个计算过程,通过一个绘制调用的实例开始,这个绘制调用用点列表来绘制所有的顶点(粒子)。绘制调用的实例的数目设置为粒子影响的切片的数目。
[0126] 参照图3,示出了本发明基于切片的算法的图创建切片索引结构示意图。
[0127] 从图3中,可以看出基于切片的算法的图创建切片索引的过程。
[0128] 本发明中基于切片的算法的其余步骤在着色器代码里面实现。
[0129] 其中,所述采用基于切片的计算方式的步骤,包括:
[0130] 子步骤G1、通过顶点着色器完成顶点着色器代码中的计算过程,获得顶点着色器的计算结果。
[0131] 其中,所述子步骤G1具体可以包括:
[0132] 子步骤H1、采用实例id和粒子位置的z分量来计算三维纹理里渲染目标的切片下标,获得三维纹理里渲染目标的切片下标。
[0133] 子步骤H2、把x、y分量从世界空间变换到归一化设备空间。
[0134] 子步骤H3、计算粒子位置到渲染目标切片的偏移,获得片元和粒子之间距离的数值。
[0135] 其中,计算粒子位置到渲染目标切片的偏移,这将用于基于切片的算法确定片元和粒子的距离。
[0136] 子步骤G2、通过几何着色器完成几何着色器代码中的计算过程,获得几何着色器的计算结果。
[0137] 其中,所述子步骤G2具体可以包括:
[0138] 子步骤I1、验证计算获得的渲染目标切片下标。
[0139] 子步骤I2、渲染目标切片下标在有效范围内,生成四个输出顶点并连接成为两个三角形带,获得渲染目标切片下标的四边形;
[0140] 其中,所述每个输出顶点的属性为输出顶点的体切片下标、输出顶点的粒子浓度、输出顶点的顶点位置及输出顶点的三维纹理坐标。
[0141] 其中,所述顶点着色器后是几何着色器,
[0142] 几何着色器主要完成如下的内容:
[0143] 首先验证计算得到的渲染目标切片下标(这在几何着色器里完成)。如果切片下标在有效范围内,生成四个输出顶点,连接为两个三角形带,这形成了一个四边形。每个输出顶点有如下属性,体切片下标,粒子浓度,顶点位置和三维纹理坐标。位置根据二维归一化设备空间粒子位置加每个点的偏移来得到。纹理坐标的x,y分量来自数组,纹理z是顶点着色器中计算的粒子位置到渲染目标平面的偏移。
[0144] 子步骤G3、通过像素着色器采用光线投射算法的方法来完成像素着色器代码中的计算过程,获得像素着色器的计算结果。
[0145] 为了使本领域的技术人员更好地理解本发明,在本发明的另一个优选实施例中,所述子步骤G3,具体可以包括:
[0146] 子步骤J1、通过属性的插值及像素着色器来计算纹理坐标矢量的长度,获得纹理坐标矢量的长度。
[0147] 子步骤J2、将纹理坐标矢量的长度作为浓度方程的纹理的纹理坐标,获得浓度方程的纹理的纹理坐标。
[0148] 子步骤J3、采样值乘以粒子浓度,获得采样纹理坐标的浓度。
[0149] 子步骤J4、采用加性混合方法加到渲染目标的已知值上来进行渲染,获得采样纹理坐标的渲染后浓度。
[0150] 光栅化这两个三角形到选择的渲染目标上(三维纹理切片),这包括属性的插值,最终的像素着色器计算纹理坐标矢量的长度。用它作为包括浓度方程的纹理的纹理坐标。采样值乘以粒子浓度值给出最终的浓度,使用加性混合加到渲染目标的已有值上。
[0151] 体数据集的可视化有多种方法,本发明中采用了光纤投射算法。
[0152] 1)光线投射算法的基本原理
[0153] 光线投射算法的工作过程如下,对于显示体的最终图像的每一个像素,计算一个观察射线。
[0154] 参照图4,示出了本发明中光线投射算法的创建射线的示意图。
[0155] 从图4中可以看出采用光线投射算法来创建射线的全过程。
[0156] 然后,从这个射线与体边界的入口交点开始,沿射线以递增的位置重复采样体数据集。根据一定的条件(例如累加的透明度超过阈值)终止这个过程。
[0157] 参照图5,示出了本发明中光线投射算法的沿射线采样示意图。
[0158] 从图5中可以看出采用光线投射算法来沿射线采样的全过程。
[0159] 为了使本领域的技术人员更好地理解本发明,在本发明的另一个优选实施例中,所述子步骤G3,具体可以包括:
[0160] 子步骤K1、在光线投射算法的初始化阶段,创建两个纹理,获得初始化的两个纹理。
[0161] 子步骤K2、在光线投射算法的循环阶段,在一次循环过程中,分别渲染表示体边界的后向面及前向面,获得纹理空间的射线方向和长度;当一次循环过程结束后,沿纹理空间的射线方向计算采样点,采样体纹理的数据信息并将采样点的采样值进行累加,获得像素着色器的计算结果。
[0162] 其中,所述在一次循环过程中,分别渲染表示体边界的后向面及前向面,获得纹理空间的射线方向和长度的步骤,包括:
[0163] 子步骤M1、开始渲染表示体边界的包围盒的后向面;采用光栅化器来插值包围盒顶点的纹理空间坐标,获得插值后的包围盒顶点的纹理空间坐标;通过像素着色器将插值后的包围盒顶点的纹理空间坐标送到渲染目标中,获得包围盒的前向面的渲染目标的值;其中,通过包围盒的光栅化的方式来创建片元,获得为生成与体相交的射线的像素的片元。
[0164] 子步骤M2、开始渲染包围盒的前向面;采用光栅化器来插值包围盒顶点的纹理空间坐标,获得插值后的包围盒顶点的纹理空间坐标;通过像素着色器将插值后的包围盒顶点的纹理空间坐标送到渲染目标中,获得包围盒的前向面的渲染目标的值;其中,通过包围盒的光栅化的方式来创建片元,获得为生成与体相交的射线的像素的片元。
[0165] 子步骤M3、激活的像素着色器采用片元的归一化设备坐标来采样包围盒的前向面的渲染目标的值及包围盒的后向面的渲染目标的值,获得每次采样的相应的渲染目标的值。
[0166] 子步骤M4、通过每次采样的相应的渲染目标的值来计算纹理空间的射线方向和长度,获得每次采用的纹理空间的射线方向和长度。
[0167] 本发明使用像素着色器来实现光线投射算法的所有关键部分。为了是本领域的普通技术人员能够更好地理解本发明,下面以一个具体的实例来对使用像素着色器的光线投射算法来进行详细介绍,具体如下所述:
[0168] 光线投射算法的主要步骤如下,在初始化的时候,创建两个纹理。
[0169] 然后在循环的时候,首先渲染表示体边界的包围盒的后向面,包围盒的光栅化将为生成与体相交的射线的所有像素创建片元,光栅化器将插值包围盒顶点的纹理空间坐标,像素着色器将把纹理空间坐标送给渲染目标。然后再渲染包围盒的前向面,再一次插值纹理坐标,把纹理空间坐标送给渲染目标。
[0170] 这样就可以得到观察视线与体纹理相交的纹理空间的进入点和离开点。
[0171] 最后,渲染前向面,激活的像素着色器使用片元的归一化设备坐标去采样前面两个渲染目标的值,用来用来计算纹理空间的射线方向和长度。然后,执行循环,沿这个射线计算采样点,采样体纹理的数据,累加这些采样点的采样值。
[0172] 因为像素着色器的性能已经有很大的改进。Shader model 4引入了许多特性,不限长度的shader代码和分枝特性。这就使光线投射算法的实现更直观,可以在一个循环中执行全部的光线跟踪过程。
[0173] 参照图6,示出了本发明中像素着色器的光线投射算法中的光线跟踪起始点的示意图。
[0174] 从图6中可以看出:本发明中像素着色器中的光线投射算法中的光线跟踪起始点的全过程。
[0175] 子步骤C2、计算每个粒子的力及颜色场值,获得每个粒子的力及每个粒子的颜色场值。
[0176] 子步骤C3、移动粒子并清空粒子的相关场,获得更新的三维流体的数据信息。
[0177] 步骤104、将所获得的三维流体的数据信息的流体模拟结果进行渲染,获得渲染后的三维流体的数据信息的流体模拟结果。
[0178] 总之,本发明提供了一种基于GPU的三维流体模拟方法,该方法可以实现对三维流体模拟过程的简单及实时操作。
[0179] 以上对本发明所提供的一种基于GPU的三维流体模拟方法进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。