一种三维地震数据固定轴向切片动态判断体绘制方法技术领域
本发明属于油气及煤层气地震勘探与开发领域,具体涉及一种三维地震数
据固定轴向切片动态判断体绘制方法。
背景技术
随着地震处理、解释软件的发展,三维可视化技术在地震勘探中的应用不
断扩大。地震勘探精度的逐年提高,产生的三维地震叠前数据体也从几十GB上
升到几百GB,并逐年上升,从而给地震叠前海量数据的三维可视化显示带来了
新的挑战-如何改变传统的数据组织方式,高效、实时的进行地震数据体绘制,
已成为科研工作者急需解决的难题。
体绘制使用大量足够小的体素(Voxel)作为绘制的基本单位,例如四面体
和六面体体素,组合成需要表达的地质体。由于体素单元足够小,可以认为每
个体素具有单一的属性,所以这种模型可以用来表达非均匀的地质体。将三维
地质体划分成若干个体素,空间位置以x,y,z表示,在x轴上分割L个单元,
在y轴上分割成M个单元,在z轴上分割成N个单元。地质体可用L*M*N个体
素来表示,这些体素按照自身的空间位置组合,即构成研究对象的三维形态。
空间上每一个体素均具有某一类属性值(如振幅值),并以数值型数据来表示。
三维地震数据是规则数据场,即在x,y,z三个方向上,网格点之间的距离均
相等,所以无需给出各个数据点的空间坐标,只需给出三维网格某一角点的空
间位置和某一数据点的序号,即可以根据网格间距所对应的距离求出该点的空
间位置。以体素为基础的体可视化中,每个数据采样点被转换成一个体素。体
素是一个三维对象,它的尺寸近似等于面元间的间距和采样间隔。每个体素有
一个对应于原三维数据体的值,一个RGB(红色,绿色和蓝色)颜色值和一个不
透明度。所以,每个地震道转换成了一个体素队列。
在绘制过程中,体素始终保持着绘制初期所需的一切信息,包括颜色等级,
透明度等,能够很好地反映地质构造整体特征和内部细节。体绘制算法能产生
三维数据场的整体图像,包括每一个细节,并具有图像质量好,便于并行处理
等优点。其主要问题是,计算量很大,计算时间较长。在体绘制的发展过程中,
尽管现在计算机的计算速度、内存容量以及其它图像加速设备的发展日新月异,
但是对于庞大的体数据,体绘制速度始终难尽如人意。为了解决这种状况,研
究人员们基于现有的硬件环境,根据各种应用的具体需求,在生成的图像质量
和绘制速度之间寻求可能的最佳方案,使绘制速度尽量满足用户的要求,同时
保证一定的图像质量,由此,形成了许多不同的体绘制算法。
目前常用的体绘制算法本质有两种,一种是将体切成若干面片,之后利用
正常渲染管线的面绘制功能模拟体绘制效果,另一种是基于图像空间的ray
marching,从视点发射射线穿过每个像素,迭代计算射线与体数据的交点,生
成各像素的最终颜色信息。
从最终渲染质量来说,raymarching的效果是最好的,它不存在切片的方
向、边界处理问题,也不存在纹理采样的失真问题,但raymarching并不适合
大规模数据渲染,因为raymarching基于屏幕空间,一次drawbatch的基准
开销非常大,而目前市面的图形绘制硬件一般只允许一次挂接最多32个
texture,这直接限制了raymarching的大数据渲染能力。
对于切片绘制算法,从面片切分方式上又可以分为两类,一类是延某个固定轴
向切片,另一种是动态切片。固定轴向的切片是没法提供用户交互的渲染效果
的,因为硬件光栅化本身的缺陷,无论从哪个方向切,总能找到某些失真的观
察角度。动态切片则很好的解决了这个问题,它在程序实际绘制时根据当前的
相机位置,动态的决定最佳的切片方向(这通常是沿着视线的方向)。动态切片
对于每个数据块都要实时的进行切片生成并将生成好的切片传送到显示设备,
这对CPU的计算能力和显存带宽都增加了很大的负担,因此同样不适合用于大
规模的体绘制渲染。
发明内容
本发明的目的在于解决上述现有技术中存在的难题,提供一种三维地震数
据固定轴向切片动态判断体绘制方法,解决海量数据实时体绘制的难题,为油
气勘探工作者提供一个更为精确的地质构造形态,便于专业人员能对原始数据
做出正确解释,得到矿藏是否存在、矿藏位置及储量大小等重要信息。必将大
大提高寻找油藏的效率,从而具有重大的经济效益及社会效益。
本发明是通过以下技术方案实现的:
一种三维地震数据固定轴向切片动态判断体绘制方法,包括:
对三维地震数据进行预处理,将原始数据分块并转换为多种分辨率;采用
固定切片、动态选择的方式来降低运行时的计算开销和节省运行时的显存带宽;
采用固定切片、动态选择的方式综合固定切片和动态切片两种算法的优点,在
保证了绘制时计算开销极小的情况下,达到非常高质量的渲染效果。
在场景裁剪时,采用层次空间划分的树形策略进行三维地震数据的多分辨
率分块处理,形成场景树,并设置裁剪标志,降低了绘制过程中加载的数据量;
场景绘制时,利用所述场景树及裁剪标志进行处理。
所述固定切片、动态选择的方式具体如下:
在初始化阶段预生成多个方向的切片数据,在绘制时,只根据相机位置判
断出一个最佳的绘制方向,选择那个方向的切片数据即可,具体如下:
在预处理阶段对三维地震数据进行处理,生成X,Y,Z,-X,-Y,-Z六个
方向的三角形切片序列,并保存于显存中;
绘制时根据相机与待绘制分块的位置关系动态的选取一种方向作为当前分
块的分片方案,之后只需要调用预处理时已生成的此方向分块切片序列进行绘
制即可。
所述绘制时根据相机与待绘制分块的位置关系动态的选取一种方向作为当
前分块的分片方案是这样实现的:
设分块中心到相机的向量为Vview,分块局部空间内六个方向的固定轴在
世界空间(世界空间对应的是屏幕设备空间)中的方向为Vx,V-x,Vy,V-y,Vz,
V-z,则上述六个向量中与Vview夹角最小的向量所代表的轴向即为此分块所
采用的轴向。
所述此分块所采用的轴向是通过向量点积来确定的,具体如下:
将Vview分别和Vx,V-x,Vy,V-y,Vz,V-z六个向量做点积,点积值最
大的轴向即为此分块所采用的轴向。
所述采用层次空间划分的树形策略进行三维地震数据的多分辨率分块处
理,形成场景树具体如下:
把三维地震数据按照不同的分辨率进行分块:
根节点表示整个三维空间区域;
将该整个三维空间区域分成8个大小相同的小区域,用其八个子女节点表
示;
对于每一个所述的小区域,继续将其分成8个更小的区域;
按此规则一直分割到不再需要分割或达到规定的层次为止,形成场景树。
所述设置裁剪标志是这样实现的:
为场景树的每一个节点增加一个裁剪标志,所述裁剪标志有三种取值:完
全在场景中、部分在场景中、完全在场景外;
从根节点遍历场景树,同时使用相机的平截头体对节点进行裁剪;
如果当前节点完全在场景中,则它的子孙必定也在场景中,无需继续遍历;
如果当前节点完全在场景外,则它的子孙也必定在场景外,无需继续向下
遍历;
如果当前节点部分在场景中,所述方法将继续遍历子节点直到遇到前两种
情况(其子节点在场景中或场景外)或者叶子节点,如果是叶子节点将其作为
完全在场景中的节点进行处理,这样在绘制时本发明只需要处理所有被标注为
完全在场景中的节点即可。
所述场景树中,各个节点的数据体积是相等的,如果剩余数据不够分块大
小,用0补齐。
所述场景树在读入三维地震数据时被创建,而且在整个绘制过程中,它的
结构是静态的
所述场景绘制时,利用所述场景树及裁剪标志进行处理是这样实现的:
从根节点遍历场景树,当遇到一个裁剪标志为完全在场景内的点时,首先
检查当前节点的体数据是否已载入,若已经载入,则绘制当前节点,若当前节
点的体数据尚未载入,则向上回溯,直到找到体数据已载入的祖先节点,之后
使用祖先节点的低分辨率体数据来绘制当前节点。
与现有技术相比,本发明的有益效果是:体绘制是规则数据场可视化的关
键技术之一。本发明提出了一种固定轴向切片、动态判断的体绘制方法。该方
法利用缓存管理将数据IO的负载有效地分散,提高了IO的效率;利用数据分
块和多分辨技术使得显示的数据在显示效果和绘制负载上的平衡更为合理;充
分利用GPU的高性能计算能力,将大量的颜色计算、可见区域计算等工作由GPU
完成,即降低了总线到显卡的数据传输负载,又提高了绘制速度,将CPU从繁
重的计算中解放出来。实验证明,本发明的方法是行之有效的,既保证了绘制
的帧频,又能够获得满意的渲染效果。
附图说明
图1固定轴向切片示意图
图2场景树
图3整体数据的体绘制示意图
图4利用垂直于x、y、z轴的平面对体绘制数据进行裁剪示意图
图5利用层位面和垂直于x、y轴的平面对体绘制数据进行裁剪示意图
图6本方法的步骤框图
图7数据分块二维示意图。
具体实施方式
下面结合附图对本发明作进一步详细描述:
针对三维地震海量数据的固定轴向切片、动态判断的体绘制算法及相应的
场景裁剪、场景绘制模式。
如图6所示,本发明包括:固定轴向切片动态判断体绘制算法、场景裁剪、
场景绘制三部分。
第一步:固定轴向切片动态判断体绘制算法:
本发明的体绘制模块采用了一种预生成切片,但动态选择的绘制算法,这
种算法拥有如下优点:
1运行时计算开销CPU很小。利用GPU的大规模并行能力,避免了CPU上
的繁重的逐体素计算。
2切片数据可以预生成,从而预存于显存,节省运行时显存带宽。
3绘制时动态的选择绘制方向,保证最终的渲染质量非常接近动态切片渲
染。
固定切片、动态选择算法的主要思想就是综合固定切片和动态切片两种算
法的优点,在初始化阶段预生成多个方向的切片数据,在绘制时,只根据相机
位置判断出一个最佳的绘制方向,选择那个方向的切片数据即可。这样,既保
证了绘制时计算开销极小(通常只需要几个向量运算即可),又不需要绘制时频
繁传输切片数据,而且可以保证达到非常高质量的最终渲染效果。
这种绘制算法只需在预处理阶段生成X,Y,Z,-X,-Y,-Z六个方向的三
角形切片序列,保存于显存中,绘制时根据相机与待绘制分块的位置关系动态
的选取一种方向作为当前分块的分片方案,之后只需要调用预处理时已生成的
此方向分块切片序列进行绘制即可,不需要任何运行时的几何信息的总线传输,
在节省带宽的同时又提高了绘制速度,这种预处理方案与后面描述的裁剪搜索
树是本模块在大数量的情况下依然可以保证实时绘制速度的基础。
对于每一个轴向的正负两种方向,仅仅是方形面片(quad面片)的排列顺
序有所不同,这是因为在透明模式下,面片必须以从后向前的方式绘制,因此
每个轴向必须准备正负两种方案。
六个固定方向的切片方式如图1所示。
当绘制一个分块时,设分块中心到视点位置(即相机)的向量为Vview,分
块局部空间内六个方向的固定轴在世界空间中的方向为Vx,V-x,Vy,V-y,Vz,
V-z,则上述六个向量中与Vview夹角最小的向量所代表的轴向即为此分块所
采用的轴向(即绘制时根据相机与待绘制分块的位置关系动态的选取一种方向
作为当前分块的分片方案),此操作可简单的通过一个向量点积来完成,具体如
下:向量的点积与它们的夹角的余弦成正比,因此如果点积越大,说明夹角越小。
Vview分别和Vx,V-x,Vy,V-y,Vz,V-z六个向量做点积,点积值最大的轴向
即为此分块所采用的轴向。
第一步的作用是判断用户旋转三维场景过程中,从哪轴向绘制数据体,观
看效果最好、效率最高、旋转到什么角度后需要换轴向。
第二步:场景裁剪:
海量数据的场景管理直接影响最终的体绘制性能,因此本发明选择了层次
空间划分的树形策略。体数据的多分辨率划分本身呈现层次特征,因此依靠体
数据本身即可以方便的建立空间的层次结构,依靠层次结构可以对场景进行快
速的裁剪和分辨率判断,这样,只有真正有效的数据块和真正有效的分辨率层
才会被送到显示设备进行绘制,节省了大量不必要的绘制工作。
本模块使用类似于八叉树的空间结构进行场景管理,因此,场景的裁剪也
在此场景树结构中完成。原始的体数据经过多分辨率分块处理后从空间角度看,
每个低分辨的分块包含若干高分辨的分块,这本身即形成了一个树形的结构。
原始数据的多分辨率分块处理是指:把原始数据按照不同的分辨率进行分
块,具体分块的方式是按照八叉树的三维数据结构进行分割:在八叉树的树形
结构中,根节点表示整个三维空间区域。将该区域分成8个大小相同的小区域,
用其八个子女表示(最低级分辨率)。对于每一个这样的区域,继续将其分成8
个更小的区域。按此规则一直分割到不再需要分割或达到规定的层次为止(最
高级分辨率);将原始数据分块的好处有两个,一是有了数据分块,可以使用分
布计算或绘制,将不同的块发送到若干并行的计算机上进行处理,提高处理速
度;二是可以使用多线程处理方法,处理好一块,显示输出一块,使得用户不
必花费一段较长的时间来等候整个数据体的处理完毕,改善了用户交互的友好
性。数据分块二维示意图如图7所示。
从空间角度看,每个低分辨的分块包含若干高分辨的分块,这本身即形成
了一个树形的结构。在体绘制的模块中,维护着这样一棵层次结构的树,它的
根节点代表整个数据体,这是细节最粗糙的一级分辨率,它的孩子为分辨率更
精细的分块,每个分块又以其包含的高一级分辨率的分块为孩子,以此类推,
即形成了整棵树。图2中为一颗只有两层(层数和节点数一般是用户来决定:显
示数据前,需要有一个数据转化的过程,即多分辨率分块处理,此时会有一个
交互界面,用户输入这两个参数,数据分多少层、块的大小也是根据数据的大
小、计算机的配置有一定规律的。)细节层次的场景树,该图中的细节层次0的
分块,每个分块在空间中只表示其父节点的一部分,但它们的数据体积相等,
因此其分辨率更高。具体实施是,数据分块的大小是一致的,如果剩余数据不
够分块大小,用0补齐。
这颗场景树在读入体数据文件时即可以被创建,而且在整个绘制过程中,
它的结构是静态的,显示模块所做的只是在适当的时候更改或查询依附于节点
之上的某些裁剪标志位,这都与八叉树结构非常相像。这种树形结构之所以区
别于八叉树,是因为这种树形结构的每个节点的孩子数量取决于体数据不同细
节层次间的采样比例,另外,即使在同一棵树中,其根节点的孩子数也与其它
节点不同。
为了实现场景裁剪的功能,本发明为场景树的每一个节点增加了一个裁剪
标志,这个裁剪标志有三种取值:完全在场景中,部分在场景中,完全在场景
外,这三种取值代表了当前节点与相机平截头体的位置关系。本发明的场景算
法是从根节点遍历场景树,同时使用相机的平截头体对节点进行裁剪,如果此
节点完全在场景中,则它的子孙必定也在场景中,无需继续遍历;若当前节点
完全在场景外,则它的子孙也必定在场景外,因此也不需要继续向下遍历;当
此节点部分在场景中时,它的孩子的情况则无法判断,因此裁剪算法可继续遍
历直到遇到前两种情况或遇到叶节点(叶节点指的是最高分辨率节点,叶子下
面没有分支了。所以遍历到叶子节点的情况,就无法再分块了。)。对于部分在
场景内的叶节点,本发明将其作为完全在场景中的节点处理,这样在绘制时本
发明只需要处理所有被标注为完全在场景中的节点即可。
第一步确定的是轴向,即确定了从哪个方向观察这个三维物体即哪个方向
绘制;第二步是场景裁剪,而场景裁剪的基础是数据分块,只有数据分好块,
才能动态的向显卡里加载数据。因为数据很大,超出显示窗口的块就没有必要
加载,用户窗口多大就加载多少块,也就是所谓的裁剪。
第三步:场景绘制
绘制与场景裁剪相似,同样需要从根节点遍历场景树,当遇到一个标示为
完全在场景内的点时,算法首先检查当前节点的体数据是否已载入,若已经载
入,则绘制当前节点,若当前节点的体数据尚未载入,则向上回溯,直到找到
体数据已载入的祖先节点,之后使用祖先节点的低分辨率体数据来绘制当前节
点。因为绘制模块在程序初始化时会预载入一个低分辨的细节层作为preview
层次,因此任何节点一定可以找到附带体数据的祖先节点。算法伪代码如下:
在本方法的实际实现中,考虑到绘制效率,实际上采用了两次遍历的算法,
第一次遍历只检测裁剪标志,并不直接绘制,即把节点分门别类:1、场景外、
不需要绘制的。2、场景内、需要绘制且数据已加载的。3、场景内、需要绘制
且数据未加载的。第二次遍历时才按第一次遍历的检测结果进行高效绘制,缩
短绘制的时间。这样做的一个主要好处就是本发明可以合并分块,对于一个节
点,当算法发现其所有的孩子都是通过自己所附带(已加载到显存)的数据绘
制时,则没有必要分别绘制每个孩子,只一次性绘制当前的节点即可。这种情
况是指,在第一次遍历时发现:这个节点所有的孩子节点数据都已经加载并绘
制,则只绘制当前节点。
下面以实际的三维地震数据应用实例来说明发明的效果。
实验所用计算机为DellPrecisionM4400,配置是,IntelCoreQuadQ9100
2.26GHz,4GB内存,显卡是nVidiaGeoforceQuadroFX1700M。测试数据为
1950*2100*6001,总字节量约为93GB,处理成多分辨数据后约为114GB。
在浏览该地震数据时,给该次应用分配了1024MB内存作为数据缓存,300MB
的显存。浏览方式包括整体浏览、平面切分局部浏览、层位面切分局部浏览、
属性值过滤浏览等方式。
图3为利用本发明实现的该数据整体载入的体绘制效果。
整体载入数据虽然能够对数据有个完整的了解,但由于现存的限制,能够
获得的细节程度不够高。因此需要利用各种方式对其进行裁剪,来获得更高细
节的输出图像。裁剪方式可以有两种。一种是利用垂直于x、y、z轴的平面(是
指分别垂直于一个轴的平面?)来裁剪;另一种是利用层位面来进行裁剪。利
用层位面来裁剪需要处理的计算量较大,因而速度相对较慢一些。图4为使用
行垂直于x、y、z轴的平面来裁剪。图5为使用层位面和垂直于x、y轴的平面
来进行场景裁剪。
本发明提出了一种针对三维地震海量数据的固定轴向切片、动态判断的体
绘制方法,该方法利用缓存管理将数据IO的负载有效地分散,数据分块和多分
辨率功能提高了IO的效率;利用数据分块和多分辨技术使得显示的数据在显示
效果和绘制负载上的平衡更为合理;充分利用GPU的高性能计算能力,将大量
的颜色计算(每个体素都是有颜色。绘制这些体素的属性信息都是采用了GPU
能够识别的语言进行绘制,不需要CPU进行参与。)、可见区域计算等工作由GPU
完成,既降低了总线到显卡的数据传输负载,又提高了绘制速度,将CPU从繁
重的计算中解放出来。实验证明,本发明的算法是行之有效的,既保证了绘制
的帧频,又能够获得满意的渲染效果。
上述技术方案只是本发明的一种实施方式,对于本领域内的技术人员而言,
在本发明公开了应用方法和原理的基础上,很容易做出各种类型的改进或变形,
而不仅限于本发明上述具体实施方式所描述的方法,因此前面描述的方式只是
优选的,而并不具有限制性的意义。