专利名称:一种三维地震体数据的实时光线投射体绘制方法
技术领域:
本发明属于计算机图形学领域和地质建模领域,涉及多分辨海量地质数据的实时渲染,使用CUDA并行技术,为一种三维地震体数据的实时光线投射体绘制方法。
背景技术:
体绘制作为一种渲染技术,具有对三维数据完全的描述能力,广泛应用在医疗、地质成像、数字雕刻等领域。将体绘制技术应用到三维地震体数据的实时渲染上能够极大提闻石油的勘探效率。三维地震体数据具有海量、多分辨率的特点,由于硬件条件的限制,我们的渲染工作需要有良好的数据调度管理。另外,为了提高最终的渲染质量,在一次渲染中,要根据观察点和体数据的三位位置关系,使用不同分辨率的体数据块进行体绘制。这样才能达到实时和良好的绘制效果。但是由于体绘制在计算过程中要遍历所有视点中的体数据块,所以对于海量三维地震体数据的体绘制是一个计算和数据双重密集的问题。传统的体绘制技术主要针对小规模数据,而且计算量大,复杂度高,难以达到实时交互式体绘制的要求。基于硬件的体绘制算法由于硬件价格昂贵及纹理数量的限制等原因难以普及。随着图形芯片技术的发展,早期仅适用于工作站平台的实时体绘制技术在PC平台也得到了快速发展。随着GPGPU概念的提出,基于CPU-GPU的异构并行计算平台为PC平台计算的性能提升提供了可能。CUDA (Compute Unified Device Architecture,统一计算架构)是由NVIDIA所推出的一种整合技术,是该公司对于GPGPU的正式名称。得益与此,很多成像效果好,但计算量巨大的体绘制方法已经可以在PC平台上实现实时的运算和绘制。本发明结合地质领域的应用需求,提出了 一套基于CUDA并行计算架构的,针对海量三维地震体数据的光线投射实时体绘制算法。
发明内容
本发明要解决的问题是:针对多分辨海量三维地震体数据,进行实时体绘制,现有的算法要么无法绘制海量数据,要么无法达到实时渲染的效果,要么成像效果不佳,难以达到要求。本发明的技术方案为:一种三维地震体数据的实时光线投射体绘制方法,使用CUDA并行技术对三维地震多分辨体数据进行实时渲染,包括以下步骤:步骤1:使用CUDA并行技术进行当前分辨率下体数据块是否可见的判断:在当前渲染场景下,根据绘图程序接口 OpenGL当前的ModelView矩阵和Projection矩阵计算出视锥的6个面,用来判断当前分辨率下体数据块是否出现在可见视锥中,即当前分辨率下体数据块是否可见:将视锥视为AABB包围盒,判断体数据块8个顶点中的positive顶点和negative顶点是否在视锥中,从而判断该体数据块是否出现在视锥中;所述的计算和判断利用CUDA并行技术并行化;
如果当前分辨率级别未设置,将当前分辨率级别初始化为三维地震多分辨体数据的最低分辨率级别;步骤2:使用CUDA并行技术判断可见体数据块的当前分辨率是否满足需求,以确定最终渲染时,各可见体数据块所使用的分辨率,并生成本次渲染需要的体数据块列表:判断当前分辨率是否满足需求时,先将可见体数据块投影到绘制平面,得到体数据块在绘制平面上的8个投影点,计算这8个投影点的最小包围盒,此包围盒的面积为计为S,与当前分辨率下体数据块的侧面的面积Rs相比较,如果S>Rs说明该体数据块分辨率不足,将当前分辨率级别提高一级,如果此时已经达到三维地震多分辨体数据的最高分辨率级别,则分辨率选择结束,否则,回到步骤1,进行高一级分辨率下的判断,同时将本次分辨率判断的结果保存下来;如果所有体数据块的S < Rs,则所有体数据块都不再需要提高分辨率,分辨率选择结束;如果分辨率判断结束后,渲染所需要的体数据块数量超出显存所能容纳的范围,则恢复到上一次选择的分辨率结果;由最终确定分辨率的体数据块得到本次渲染需要的体数据块列表;步骤3:判断需要的体数据块是否被调度,使用多线程技术对需要调度的体数据块进行I/o调度,并进行硬盘、内存、显存的三级调度、缓存管理:对本次渲染所需要的体数据块列表,先查询数据管理器所需要的体数据块是否在显存中,如果在就不需要再重新调度了,如果不在,先在内存缓存中查找,找到后调度进入显存,如果没有找到再从硬盘中查找,然后调度入显存;其中,数据管理器采用硬盘一内存一显存的三级数据管理模式,显存用于存放本次渲染所需要的体数据块,内存用于存放本次渲染所需要的体数据块以及缓存数据,以提高I/o调度的效率,硬盘用于存放全部三维地震体数据;内存管理使用“最近最少调度算法”,在内存空间不足时,标示为最近未用的体数据块将被淘汰,提供给新进入的体数据块使用;步骤4:在I/O调度的同时,使用CUDA并行技术对调度进来的数据进行光线投射体绘制:使用光线投射的方法对待渲染的体数据块进行采样,根据采样点所在体数据块使用的分辨率决定采样步长,每采样一个点后增加一个步长,直到穿透要绘制的体数据块区域,或超出采样点数量;对采样得到的数据值,按照颜色表计算得到颜色,再根据用户设置的透明度值将颜色值累加,得到当前采样射线在绘制平面上的最终投影点的颜色,所有采样射线的投影点颜色计算完毕后,绘制平面上就得到了最后的渲染结果。步骤I中,在判断体数据块的可见性时,首先读取三维地震多分辨体数据的最低级别分辨率,根据这一分辨率下的体数据块数量生成一张分辨率表,分辨率表的每一个位置代表一个体数据块,这个位置内的值代表这个数据块所采用的分辨率级别:-1代表此体数据块不可见,大于等于零的其他值代表该体数据块所采用的分辨率;初始化时,这张表的大小为最低分辨率下,体数据块的个数,其值全部为最低分辨率,再根据这张表和步骤2,不断更新分辨率表;如果某体数据块可见性判断结果为不可见,则在生成的分辨率表中,由该体数据块分裂而得的体数据块全部设置为不可见,即对应表格位置填-1。
步骤2中,根据当前分辨率表做进一步计算:I)、当前体数据块为不可见,则不进行分辨率选取,直接在更新分辨率表时将由该体数据块分裂而得的体数据块所对应的位置全部设置为-1;2)、当前分辨率表中某体数据块的分辨率与分裂后的下一分辨率的差值>1,说明在上一次分辨率选取时该体数据块已经不需要再分裂了,则直接在更新分辨率表时将由该体数据块分裂而得的体数据块所对应的位置全部设置为当前分辨率表中的值;如果差值=1,则进行是否需要提高分辨率的判断;因为下一分辨率是在当前分辨率的基础上加1,所以差值不可能〈I ;3)、当前体数据块经判断不需要再提高分辨率,则直接在更新分辨率表时将由该体数据块分裂而得的体数据块所对应的位置全部设置为当前体数据块的分辨率值;4)、如果判断结束后,发现没有任何体数据块需要提高分辨率,则判断结束,最终分辨率表为上一次计算得到的分辨率表;如果分辨率提升后,需要调度的体数据块超过显存所能容纳的数据量,判断结束,最终分辨率表为上一次计算得到的分辨率表;当分辨率已经提升到最高分辨率,判断结束,最终分辨率表为当前计算得到的最高分辨率下的分辨率表。步骤3中,采取硬盘、内存、显存的三级缓冲技术,并对显存上的数据进行压缩处理,由原始的float型数据转换为byte型数据,提高一次渲染中可渲染的体数据块个数。步骤4中,光线投射的步长是根据步骤2生成的分辨率表动态改变的,在渲染不同的体数据块时,查找该体数据块的分辨率表来设定步长,渲染时通过用户设定的颜色表将显存中byte类型的数据转化为RGB颜色值。相对于现有的海量实时体绘制方法,本发明具有以下优点:一、能够对海量体数据进行光线投射体绘制,并且可以达到实时绘制的效果;二、设计了基于线性数组的分辨率表描述三维场景,与传统的树形数据结构相比,便于在内存、显存中共享数据,利于使用CUDA并行处理;三、设计了分辨率选取算法,结合基于线性数组的分辨率表,在一个渲染场景下,可以有多个分辨率的体数据共同参与绘制,使得绘制效果更加平滑;四、根据采样点体数据分辨率等级动态调整光线投射的采样步长,使渲染结果更加准确;本发明从数据的处理、传输、调用等方面综合考虑,提出了一种高效的渲染方法,能够绘制海量数据,达到实时渲染的效果,成像效果优秀。
图1为本发明方法的流程图。图2为一张可见性与分辨率选取后所得到的分辨率表样例。图3为使用多种分辨率渲染的不意图。图4为最终渲染效果的示意图。图5为过滤部分颜色的渲染效果示意图。
具体实施方式
CUDA是NVIDIA公司的并行计算架构,该架构通过利用GPU的处理能力,可大幅提升计算性能。本发明方法如图1所示,主要包括使用CUDA并行技术进行体数据块是否可见的判断;使用CUDA并行技术判断体数据块当前分辨率是否需要提高,以确定最终渲染时,各体数据块所使用的分辨率,并生成本次渲染需要的体数据块列表;判断需要的体数据块是否被调度,使用多线程技术对需要调度的体数据块进行I/O调度,并进行硬盘、内存、显存的三级调度、缓存管理;在I/o调度的同时,使用CUDA并行技术对调度进来的数据进行光线投射体绘制四个步骤。下面结合附图对本发明做进一步说明:步骤1:使用CUDA并行技术进行体数据块是否可见的判断在当前渲染场景下,根据绘图程序接口 OpenGL当前的ModelView矩阵和Projection矩阵计算出可见视锥的6个面,用来判断体数据块是否出现在可见视锥中,SP当前分辨率下体数据块是否可见,其中ModelView矩阵指查询模型视图,Projection矩阵指投影矩阵。每个体数据块都是规则的正方体而且每条边都与坐标轴平行,所以可以将视锥视为AABB包围盒,判断体数据块8个顶点中的positive顶点和negative顶点是否在视锥中,从而判断该体数据块是否出现在视锥中。这里包围盒算法是一种求解离散点集最优包围空间的方法,AABB包围盒(Axis-aligned bounding box)定义为包含该对象,且边平行于坐标轴的最小六面体。对三维地震数据的空间描述中,高一级分辨率下,用8个体数据块来表示低一级分辨率下的一个数据块。X,Y,Z方向分别由I个块扩展为2个块。在这种描述下,某一分辨率下的体数据块如果不可见,那么在高一级分辨率下,由它分裂出的8个体数据块一定不可见;如果该体数据块可见,由它分裂出的8个体数据块还要分辨判断可见性。步骤2:使用CUDA并行技术判断体数据块当前分辨率是否需要提高,以确定最终渲染时,各体数据块所使用的分辨率,并生成本次渲染需要的体数据块列表。判断当前分辨率是否满足需求时,先计算在视锥中的数据块投影到屏幕后长方形包围盒的面积S,与当前分辨率下体数据块的侧面的面积Rs相比较,如果S>Rs说明分辨率不足,有提高空间,则提高一级分辨率,回到步骤1,进行高一级分辨率下的判断,同时将本次分辨率判断的结果保存下来。判断开始前,先生成最低级分辨率表,所有块设置为可见,并使用最低分辨率,如果存在不可见块,则会在下一级可见性判断时修正为不可见,分辨率的值也会在分辨率选择阶段得到修正。如果所有体数据块都不再需要提高分辨率,则分辨率选择结束;如果本次分辨率判断结束后,所需要的块超出显存所能容纳的范围,则恢复到上一次选择的结果;如果本次判断已经到达最高一级分辨率,则分辨率选择结束。由此得到本次渲染需要的体数据块列表。其中步骤I中,在判断体数据块的可见性时,首先读取三维地震多分辨体数据的最低级别分辨率,根据这一分辨率下的体数据块数量生成一张分辨率表,分辨率表的每一个位置代表一个体数据块,这个位置内的值代表这个数据块所采用的分辨率级别:-1代表此体数据块不可见,大于等于零的其他值代表该体数据块所采用的分辨率;初始化时,这张表的大小为最低分辨率下,体数据块的个数,其值全部为最低分辨率,再根据这张表和步骤2,不断更新分辨率表;如果某体数据块可见性判断结果为不可见,则在生成的分辨率表中,由该体数据块分裂而得的体数据块全部设置为不可见,即对应表格位置填-1。步骤2根据当前分辨率表做进一步计算:I)、当前体数据块为不可见,则不进行分辨率选取,直接在更新分辨率表时将由该体数据块分裂而得的体数据块所对应的位置全部设置为-1;2)、当前分辨率表中某体数据块的分辨率级别与判断选择后的下一分辨率级别的差值>1,说明在上一次分辨率选取时该体数据块已经不需要再分裂了,则直接在更新分辨率表时将由该体数据块分裂而得的体数据块所对应的位置全部设置为当前分辨率表中的级别值;如果级别差值=1,则进行是否需要提高分辨率的判断;因为下一分辨率是在当前分辨率的基础上加1,所以差值不可能〈I;3)、当前体数据块经判断不需要再提高分辨率,则直接在更新分辨率表时将由该体数据块分裂而得的体数据块所对应的位置全部设置为当前体数据块的分辨率级别值;4)、如果判断结束后,发现没有任何体数据块需要提高分辨率,则判断结束,最终分辨率表为上一次计算得到的分辨率表;如果分辨率提升后,需要调度的体数据块超过显存所能容纳的数据量,判断结束,最终分辨率表为上一次计算得到的分辨率表;当分辨率已经提升到最高分辨率,判断结束,最终分辨率表为当前计算得到的最高分辨率下的分辨率表。如图2所示,即为分辨率表的一个示例。如图3所示,表示了在一个场景下,不同分辨率等级的体数据块选择的结果。离视点近的使用高分辨率,离视点远的使用低分辨率,符合客观事实。由图3可以看出整个场景中的体数据块根据投影面积的大小,选择了 3个不同分辨率等级,说明了本发明中分辨率选取算法的效果。步骤3:判断需要的体数据块是否被调度,使用多线程技术对需要调度的体数据块进行I/o调度,并进行硬盘、内存、显存的三级调度、缓存管理。对本次渲染所需要的数据列表,先查询数据管理器所需要的块是否在显存中,如果在就不需要再从调度了,如果不在,先在内存缓冲中查找,找到后调度进入显存,没有找到就从硬盘中调度。为了程序的效率,显存中的数据是对硬盘中的数据加以映射得到的,按照硬盘数据的取值范围,将float类型的原始值映射为byte类型值存储在显存上,提高一次渲染中可渲染的体数据块个数。数据管理采用硬盘一内存一显存的三级数据管理模式。显存上存放本次渲染所需要的数据块,内存上存放本次渲染所需要的数据块以及缓存数据,以提高I/o调度的效率,硬盘上则是全部多分辨体数据。内存管理使用“最近最少调度算法”,在内存空间不足时,标示为最近未用的块将被淘汰,提供给新进入的块使用。步骤4:在I/O调度的同时,使用CUDA并行技术对调度进来的数据进行光线投射体绘制。使用光线投射的方法对待渲染的体数据块进行采样,根据采样点所在体数据块使用的分辨率决定采样步长,每采样一个点后增加一个步长,直到穿透要绘制的体数据块区域,或超出采样点数量;对采样得到的数据值,按照颜色表计算得到颜色,再根据用户设置的透明度值将颜色值累加,得到当前采样射线在绘制平面上的最终投影点的颜色,所有采样射线的投影点颜色计算完毕后,绘制平面上就得到了最后的渲染结果。其中,光线投射的步长是根据步骤2生成的分辨率表动态改变的,在渲染不同的体数据块时,查找该体数据块的分辨率表来设定步长。在采样中,得到的是映射后的byte类型值,我们再根据用户的颜色映射表,将此byte值转换为RGB颜色值。通过这一步,可以过滤掉我们不需要绘制的属性值。如图4,为我们得到的最终渲染结果,光线投射体绘制算法最终的渲染结果,根据渲染后的颜色,能够很好的反映三维地震体数据所表示的地质样貌。如图5,为过滤掉部分颜色的结果,其中绿色已经被过滤掉,渲染结果中已不再绘制需要过滤掉的属性值。
权利要求
1.一种三维地震体数据的实时光线投射体绘制方法,其特征是使用CUDA并行技术对三维地震多分辨体数据进行实时渲染,包括以下步骤: 步骤1:使用CUDA并行技术进行当前分辨率下体数据块是否可见的判断: 在当前渲染场景下,根据绘图程序接口 OpenGL当前的ModelView矩阵和Projection矩阵计算出视锥的6个面,用来判断当前分辨率下体数据块是否出现在可见视锥中,SP当前分辨率下体数据块是否可见:将视锥视为AABB包围盒,判断体数据块8个顶点中的positive顶点和negative顶点是否在视锥中,从而判断该体数据块是否出现在视锥中;所述的计算和判断利用CUDA并行技术并行化; 如果当前分辨率级别未设置,将当前分辨率级别初始化为三维地震多分辨体数据的最低分辨率级别; 步骤2:使用CUDA并行技术判断可见体数据块的当前分辨率是否满足需求,以确定最终渲染时,各可见体数据块所使用的分辨率,并生成本次渲染需要的体数据块列表: 判断当前分辨率是否满足需求时,先将可见体数据块投影到绘制平面,得到体数据块在绘制平面上的8个投影点,计算这8个投影点的最小包围盒,此包围盒的面积为计为S,与当前分辨率下体数据块的侧面的面积Rs相比较,如果S>Rs说明该体数据块分辨率不足,将当前分辨率级别提高一级,如果此时已经达到三维地震多分辨体数据的最高分辨率级别,则分辨率选择结束,否则,回到步骤1,进行高一级分辨率下的判断,同时将本次分辨率判断的结果保存下来; 如果所有体数据块的S ( Rs,则所有体数据块都不再需要提高分辨率,分辨率选择结束; 如果分辨率判断结束后,渲染所需要的体数据块数量超出显存所能容纳的范围,则恢复到上一次选择的分辨率结果; 由最终确定分辨率的体数据块得到本次渲染需要的体数据块列表; 步骤3:判断需要的体数据块是否被调度,使用多线程技术对需要调度的体数据块进行I/O调度,并进行硬盘、内存、显存的三级调度、缓存管理: 对本次渲染所需要的体数据块列表,先查询数据管理器所需要的体数据块是否在显存中,如果在就不需要再重新调度了,如果不在,先在内存缓存中查找,找到后调度进入显存,如果没有找到再从硬盘中查找,然后调度入显存; 其中,数据管理器采用硬盘一内存一显存的三级数据管理模式,显存用于存放本次渲染所需要的体数据块,内存用于存放本次渲染所需要的体数据块以及缓存数据,以提高I/O调度的效率,硬盘用于存放全部三维地震体数据; 内存管理使用“最近最少调度算法”,在内存空间不足时,标示为最近未用的体数据块将被淘汰,提供给新进入的体数据块使用; 步骤4:在I/O调度的同时,使用CUDA并行技术对调度进来的数据进行光线投射体绘制: 使用光线投射的方法对待 渲染的体数据块进行采样,根据采样点所在体数据块使用的分辨率决定采样步长,每采样一个点后增加一个步长,直到穿透要绘制的体数据块区域,或超出采样点数量;对采样得到的数据值,按照颜色表计算得到颜色,再根据用户设置的透明度值将颜色值累加,得到当前采样射线在绘制平面上的最终投影点的颜色,所有采样射线的投影点颜色计算完毕后,绘制平面上就得到了最后的渲染结果。
2.根据权利要求1所述的一种三维地震体数据的实时光线投射体绘制方法,其特征是步骤I中,在判断体数据块的可见性时,首先读取三维地震多分辨体数据的最低级别分辨率,根据这一分辨率下的体数据块数量生成一张分辨率表,分辨率表的每一个位置代表一个体数据块,这个位置内的值代表这个数据块所采用的分辨率级别:-1代表此体数据块不可见,大于等于零的其他值代表该体数据块所采用的分辨率;初始化时,这张表的大小为最低分辨率下,体数据块的个数,其值全部为最低分辨率,再根据这张表和步骤2,不断更新分辨率表;如果某体数据块可见性判断结果为不可见,则在生成的分辨率表中,由该体数据块分裂而得的体数据块全部设置为不可见,即对应表格位置填-1。
3.根据权利要求2所述的一种三维地震体数据的实时光线投射体绘制方法,其特征是步骤2中,根据当前分辨率表做进一步计算: 1)、当前体数据块为不可见,则不进行分辨率选取,直接在更新分辨率表时将由该体数据块分裂而得的体数据块所对应的位置全部设置为-1 ; 2)、当前分辨率表中某体数据块的分辨率与分裂后的下一分辨率的差值>1,说明在上一次分辨率选取时该体数据块已经不需要再分裂了,则直接在更新分辨率表时将由该体数据块分裂而得的体数据块所对应的位置全部设置为当前分辨率表中的值;如果差值=1,则进行是否需要提高分辨率的判断; 3)、当前体数据块经判断不需要再提高分辨率,则直接在更新分辨率表时将由该体数据块分裂而得的体数据块所对应的位置全部设置为当前体数据块的分辨率值; 4)、如果判断结束后,发现没有任何体数据块需要提高分辨率,则判断结束,最终分辨率表为上一次计算得到的分辨率表;如果分辨率提升后,需要调度的体数据块超过显存所能容纳的数据量,判断结束,最终分辨率表为上一次计算得到的分辨率表;当分辨率已经提升到最高分辨率,判断结束,最终分辨率表为当前计算得到的最高分辨率下的分辨率表。
4.根据权利要求1或2或3所述的一种三维地震体数据的实时光线投射体绘制方法,其特征是步骤3中,采取硬盘、内存、显存的三级缓冲技术,并对显存上的数据进行压缩处理,由原始的float型数据转换为byte型数据,提高一次渲染中可渲染的体数据块个数。
5.根据权利要求2或3所述的一种三维地震体数据的实时光线投射体绘制方法,其特征是步骤4中,光线投射的步长是根据步骤2生成的分辨率表动态改变的,在渲染不同的体数据块时,查找该体数据块的分辨率表来设定步长,渲染时通过用户设定的颜色表将显存中byte类型的数据转化为RGB颜色值。
6.根据权利要求4所述的一种三维地震体数据的实时光线投射体绘制方法,其特征是步骤4中,光线投射的步长是根据步骤2生成的分辨率表动态改变的,在渲染不同的体数据块时,查找该体数据块的分辨率表来设定步长,渲染时通过用户设定的颜色表将显存中byte类型的数据转化为RGB颜色值。
全文摘要
一种三维地震体数据的实时光线投射体绘制方法,使用CUDA并行技术进行体数据块是否可见的判断,再使用CUDA并行技术判断体数据块当前分辨率是否需要提高,以上两步从低分辨率开始循环,逐步提高分辨率,直到满足分辨率要求、显存不足无法提高分辨率或已经达到最高分辨率为止,以确定最终渲染时体数据块各自所使用的分辨率;在渲染处理中使用多线程技术对需要调度的体数据块进行I/O调度,同时使用CUDA并行技术对调度进来的数据进行光线投射体绘制。相对于现有的光线体绘制方法,本发明可适用于海量体数据实时体绘制、可以在一个场景下有多个分辨率等级的数据参与绘制,计算速度快、成像效果好。
文档编号G06T15/08GK103198514SQ201310097258
公开日2013年7月10日 申请日期2013年3月25日 优先权日2013年3月25日
发明者鲁林, 唐杰, 武港山 申请人:南京大学