作者简介: 李逢春(1976-),男,重庆人,博士学位,研究方向为并行计算、三维可视化及石油勘探软件研发。E-mail:lifcmail@sina.com
针对起伏地形的大规模三维观测系统数据实时可视化问题,提出了一种基于多细节层次地形模型与精细炮检点符号模型相结合的地震观测系统实时显示方法。利用图形硬件将每帧地形数据渲染到深度纹理,运用GPU着色器并行内插出炮检点实际显示高程,从而避免了炮检点立体符号与起伏地形高程的显示偏差。实验结果表明,该研究成果能够实现起伏地形大规模三维观测系统数据的逼真和高效可视化,能有效提高地震采集软件在复杂勘探区的采集设计能力。
With the ever increasing data quantity of three-dimensional seismic geometry, geometry throughput on the GPU is becoming a severe performance limitation in petroleum exploration software.This paper presents an efficient way to render large three-dimensional seismic geometry on level-of-detail digital elevation models(DEMs). By using the OpenGL frame buffer object, the terrain elevation values are rendered directly to depth texture. And then GPU shader is employed for acquiring elevation of points in real time. With 3ds model and point texture, level-of-detail point models are established. In the detailed level, the 3ds models are used to render shots and receivers accurately, and in the coarse level point textue techniques are used to render shots and receivers approximately yet more quickly. The method proposed in this paper is universally applicable to rendering seismic geometry on various LOD terrain models, and the rendering performance is independent of the complexity of underlying terrain surfaces. The experimental results show that, the method can achieve seamless and rapid rendering of large 3D seismic geometry on LOD terrain surfaces.
地震观测系统是油气勘探采集设计、地质模型正演与照明、地震资料处理与解释系统的基础数据之一, 他主要包括激发点、接收点、关系片、激发线和接收线[1, 2, 3]。卫星遥感影像及数字高程模型(digital elevation model, DEM)作为国家基础地理信息, 由于在三维表达、分析与模拟方面具有独特的直观性与丰富的信息特性, 已经越来越广泛地应用到地震勘探生产的各个环节。日益增长的油气勘探生产对基于DEM的地震观测系统三维显示提出了越来越高的要求。一方面, 随着三维空间数据获取技术的发展, 特别是数字摄影测量、高分辨率遥感、激光扫描系统的发展, 包含被测目标更多细节的大范围数字地形和局部区域空间特征的数据获取成为可能, 数据获取成本越来越廉价[3]; 另一方面, 随着地球物理探测技术的发展特别是宽方位、高密度地震勘探的推广应用, 野外生产的接收道数不断增多, 百万乃至千万级炮检点的布设越来越普遍。基于起伏地形的海量观测系统三维实时可视化已经成为油气软件系统的一大挑战[5, 6, 7]。
起伏地形的三维观测系统显示可归结为矢量特征数据在三维地形上的显示问题。将矢量特征数据投射到三维表面的过程称为“ 覆盖” (draping)[8]。传统的矢量特征数据覆盖渲染方法, 主要有基于几何投射的覆盖和基于纹理投射的覆盖两种[9]。基于纹理投射的覆盖是广泛使用的一种方法, 其思想是先把矢量数据栅格化为纹理, 再把纹理映射到地表, 这就保证了矢量数据紧贴于地形表面。如Kersting[9]、Bruneton[10]和杨超等[11]提出一种基于四叉树结构的矢量数据栅格化方法, 采用了视点相关的多级矢量栅格纹理映射, 并在纹理等级切换过程中考虑了视点相关的纹理渐变过渡, 提高了矢量特征数据渲染的效率和质量。基于几何投射的覆盖思想是, 通过二维矢量数据与地表求交, 计算得到二维特征数据在三维空间的几何体模型, 并将其与地形DEM共同显示。如Sun M等[12]针对矢量数据绘制时出现与地形不匹配的问题, 采用根据相应的地形几何数据, 在矢量数据中引入新的顶点或线段, 从而生成与地形相匹配的矢量数据。Dai等[12]运用模板阴影体技术实现了地形叠加绘制矢量数据。该方法相对于Sun M等人的方法, 不受地形数据的约束, 且绘制效率与地形数据复杂度无关。通过对研究现状的分析, 不难发现无论是基于几何投射或基于纹理投射方法, 均缺少对立体点状模型与地形叠加显示的方案描述。事实上, 基于纹理的投射方法用来投射立体点状目标时, 会存在缺乏三维真实感和空间立体感等问题。
笔者提出多细节层次地形模型和精细炮检点符号模型相结合的地震观测系统实时显示方法, 其基本思想是:利用OpenGL深度纹理技术及其扩展功能帧缓存对象(frame buffer object, FBO)实现将地形深度值直接渲染至纹理缓存; 然后利用GPU处理单元的并行性快速获取炮检点显示高程值; 为了平衡炮检点显示效率和显示质量, 还将精细炮检点模型简化为点纹理; 最后采用覆盖千余平方公里, 具有百万级炮检点的三维观测系统对该方法进行了验证。
地形的多细节层次(LOD)方法一直是地形可视化领域的核心问题。其细分等级的计算, 最普遍且效果较好的方法是通过屏幕空间误差来控制。屏幕空间误差计算具有保持地形形态特征, 符合感知规律的简化标准, 并能够避免离散层次模型切换所造成的跳跃现象[15, 16]。实时绘制时屏幕的分辨率是有限的, 当从近处观察地形时, 对近的细节丰富的区域用较多的三角形表示; 相反, 从远处观察地形时, 使用较少的三角形表示。这样有利于根据屏幕的大小控制三角形的数目, 使得所需要绘制的三角形数目主要跟屏幕的大小有关, 而跟实际的地形数据量关系不大。
假设给定屏幕宽度为x个像素, 相机视角为θ , 相机到地形LOD子块的距离为D, 因简化产生的高程差为Δ h, 则对应的屏幕空间误差为ε 个像素:
如图1所示为沿起伏地表布设炮检点的二维剖面图, 实线表达的是未经LOD简化前的实际地形形态, 虚线表达的是在某一视点位置下简化后的地形形态。图1中a, b, c, …, l是沿地表布设的炮点(或检点), 由于地形的实时LOD简化, 其中d, h, i点悬空, 而a, b, f, g, k则会掩埋至地下。为了达到炮检点与地表高度贴合一致的目的, 每帧需要耗费大量的CPU时间逐个内插出炮检点高程, 从而降低了渲染的流畅性。
利用GPU技术实现起伏地形炮检点实时高效绘制的基本思想是:以四叉树索引组织地形数据, 综合运用地形视点相关可视化技术、OpenGL渲染到纹理技术和点纹理技术, 充分挖掘和发挥GPU的图形并行处理能力, 解决传统绘制技术的性能瓶颈。具体来说, 本文提高炮检点绘制效率的关键技术包括三点:一是利用CPU多线程动态数据调度并结合GPU着色器渲染技术提高多分辨率地形绘制性能; 二是利用深度浮点纹理提升炮检点实时高程匹配速度; 三是根据视距远近不同分别以粗略和精细方式表达炮检点模型, 兼顾了实时显示的效率和质量。
LOD表达思想是解决海量地形实时绘制的通用方法[17, 18, 19]。即采用四叉树算法递归分割地形网格模型, 直到最末一级数据块达到最高分辨率为止。由于LOD算法需要动态生成简化模型, 实时性要求很高, 如何有效管理和调度大量的地形数据是实现连续LOD算法的关键。
为了达到实时动态显示的目的, 建立基于分页的缓存机制。每一帧场景的渲染数据对应计算机内存中的一个数据页, 即由若干连续分布的数据块构成的一个存储空间。如图2所示, 在动态渲染过程中, 随着视点的移动, 调度层根据当前视点位置、视锥体大小和数据缓冲区占用情况, 向数据层发出地形数据调度请求, 不断更新数据页中的数据块。调度层同时负责清理和卸载视场之外数据块, 在数据请求的同时运用视锥体裁剪, 并以此控制无用数据页面的载入和无效场景部分的绘制, 提高绘制速度。基于四叉树索引、数据分块以及数据页动态更新的算法, 可以实现大规模、多细节层次的海量地形场景实时可视化。当更新数据页中的数据时, 从硬盘中读入新的数据会耗用一定的时间, 从而带来视觉上的“ 延迟” 现象, 这种“ 延迟” 现象将大大影响交互绘制效果。为了消减这种延迟, 可利用多线程运行机制来充分利用计算机的CPU资源, 即在横向漫游以及纵向细节层次过渡的过程中, 根据视点移动的方向趋势, 预先把即将更新的数据从硬盘中读入内存, 而其后实际的数据更新由于是在内存里实现的, 从而可以大大消减“ 延迟” 现象。
地形渲染算法的性能问题本质上还可以看作是CPU 与GPU之间的计算能力的协调或负载平衡问题。当CPU 与GPU能够保证负载平衡时, 计算能力资源总是可以获得最大程度的利用。针对GPU图形硬件的并行运算能力和可编程特性, 将大量计算(包括地表高程分层设色、顶点几何矩阵变换、光照计算)从CPU分离出来转移到GPU端, 进一步降低CPU负担, 保证了CPU和GPU之间的负载均衡。
FBO作为OpenGL扩展帧缓存, 通常用来执行渲染到纹理(render to texture, RTT)或执行离线渲染[20]。OpenGL帧缓存提供了一种有效的切换机制, 使得挂接和卸载一个纹理对象非常之迅速, 笔者利用现代GPU的帧缓存扩展特性来解决炮检点与地表高程的一致性。如图3所示, 地形经RTT渲染后得到深度纹理对象texture。地表上一点P, 在地形深度纹理texture上投影点P', 其纹理坐标记为(u, v), 通过GPU端深度纹理查找表, 即可得到(u, v)与P点高程h的映射关系:
实现的具体流程为:首先创建正射投影视图下的渲染到纹理(RTT)相机, 设定合适的视点位置(当前视场的立方体包围盒中心), 将视锥体内的地形场景挂载在相机下, 并将RTT相机绑定到一幅大小为N× N像素的纹理上; 其次, 调用OpenGL3.0的GL_ARB_framebuffer_object扩展, 即调用Shader程序, 利用GPU图形硬件将地形场景渲染为深度纹理。
RTT渲染的时候要选择正确的纹理格式, 炮检点实时显示高程的精度主要由高程纹理的格式和分辨率决定, 纹理的格式和分辨率越高, 得到的纹理高程准确度就越高。纹理格式选用为32位的浮点格式(即GL_RGBA32F_ARB); 纹理分辨率选择为2 048× 2 048像素大小, 足以满足炮检点高程匹配所需的精度要求。
炮检点绘制优化采用两种策略:一是简化远距离视点条件下点符号模型表示, 该方法能有效降低CPU-GPU数据传输压力; 二是利用GPU顶点缓冲对象提高炮检点数据向图形渲染管线提交的效率。
首先, 简化远距离视点条件下炮检点模型表示。通常以3DS模型表示炮点和检波点具有更高逼真度和更好的可视效果, 但是3DS模型的使用又会给GPU带来较大的带宽压力(每个3DS模型含有几十个顶点)。当然, 近距离观察时, 包含在视锥体内的精细3DS模型数量不大, 更多的精细模型可以通过视锥体裁剪。相反, 当处于较远的观察位置时, 无需关注模型细节, 视场内大量的精细模型则需要进一步简化以减轻系统渲染负荷。如图4所示, 文中将3DS炮检点分别简化为纹理符号, 运用OpenGL2.0点精灵(point sprite)技术, 即调用的GL_ARB_point_sprite扩展, 通过绘制一个3D的点来把纹理符号映射到屏幕上。原本是作为一个矩形的几何图元(由4个顶点组成), 然后把2D纹理映射到这个矩形上才能得到的效果, 现在使用点精灵则只需要绘制一个3D点即可。炮检点模型简化并结合点精灵技术显著减少了图形处理器需要处理的顶点数量, 降低了顶点传输所需的带宽, 可有效提高绘制性能。
其次, 利用GPU顶点缓冲对象(vertex buffer object, VBO)将炮检点数据组织成为图形渲染管线便于高速访问的模式。在传统的炮检点绘制过程中, 顶点数组的顶点数据是存储在主内存中的, 每帧都需要经PCIe总线把数据从主内存送入渲染管线。VBO本质上是显卡存储空间里的一块缓存区, 将顶点数据封装进VBO后, 则可直接从显存送入渲染管线, 传输效率较PCIe方式高几个数量级, 从而避免宝贵的带宽资源浪费。
研究成果已成功应用于多个地区大规模三维观测系统数据的实时可视化。图5所示为中国西部某地探区, 该区块面积1 120 km2(东西向长35 km, 南北向宽32 km)。规则格网数字高程模型DEM分辨率为2 m, 高程范围为1 968~3 607 m, 数据量大小为1 GB。彩色背景图像分辨率为0.2 m, 图像数据74 GB。地形数据LOD预处理分级后, 形成不同细节层次共为11层, 得到数据瓦片(包括地形和纹理图像)共计83 000 块。三维观测系统布设参数如下, 以L120S8T115200(120线8炮115 200道, 960点/接收线, 接收点距12.5 m, 接收线距为100 m, 炮点点距12.5 m, 炮线距100 m、滚动距为100 m)为参数的正交模板为例, 纵向(inline)和横向(xline)各滚动200次, 得到勘探区域inline方向长31 887.5 m, xline方向宽318 000 m。激发点数320 000, 接收点数814 088, 点数共计1 134 088。
本实验采用DELL工作站Precision T3600, CPU为英特尔至强E5系列8核处理器3.6 GHz。GPU为NVIDIA Quadro K2000, 显存2 GB, 显存位宽128 bit。着色器程序使用GLSL语言编写。操作系统为win7专业版64位, 显卡驱动支持OpenGL4.4。具体参数如表1所示。
![]() | 表1 实验环境 |
针对上述数字地形DEM和三维观测系统数据, 利用本文方法实现了沿起伏地形的炮检点三维实时可视化。三维显示窗口大小1 350× 800像素, 深度纹理大小为2 048× 2 048像素, 屏幕显示误差设定为2个像素。沿预设路径进行三维漫游, 主内存缓冲区中的地形数据瓦片数目维持在50~70之间。
图6a所示为近距离视点下三维观测系统炮检点数据在起伏地形上的绘制效果。地形精细度会随着视点与地形的远近距离发生动态变化。炮检点显示高度与LOD表达的地表高程吻合一致, 无“ 漂浮” 和“ 掩埋” 现象。近距离视点条件下, 激发点和接收点均以逼真的3DS模型显示, 地球物理工程师结合地形起伏度、地表通行状况和通视条件, 便于判断实地勘探施工的难易程度, 对于交互式炮点偏移与观测系统变观非常有意义。图6b所示为远距离视点下三维视觉效果, 视野范围明显变大, 便于掌握勘探区整体概况。此时视场中包含的炮检点数据增多, 炮检点自动以简化的点纹理显示。
为了展示基于GPU的深度纹理高程匹配方法(GPU方法)在实时绘制中所起到的关键作用, 本文采用了基于OpenMP并行化的CPU插值高程匹配方法(CPU方法)予以对比。性能测试结果如图7所示, 当使用GPU方法时, 显示帧率保持在30~35帧/秒; 当使用CPU方法时, 显示帧率在8~30帧/秒。影响CPU方法流畅性的原因在于:随着视点的移动, 主存中的地形数据块动态更新, 每当有新的地形数据块载入时, 图形渲染管线停顿以等待CPU插值和更新炮检点高程。性能对比结果表明, 基于GPU的深度纹理方法整体优于CPU插值方法。
三维观测系统可视化技术在石油地震采集中的作用日益凸显, 基于实际DEM起伏地形的地震观测系统的实时可视化技术是辅助地球物理工程师们分析处理地震资料的重要工具和手段, 对地震采集工程软件系统具有重要意义。针对山地、丘陵、黄土塬等地震勘探, 提出了一种基于多细节层次地形模型和精细炮检点符号模型相结合的地震观测系统实时显示方法。能够将每帧地形数据渲染成深度纹理, 运用着色器并行内插出炮检点实际显示高程, 避免了炮检点符号与起伏地形高度的显示偏差, 是一种立足于GPU的适合现代图形硬件的解决方案; 采用基于精细3DS模型和简化的点纹理符号相结合的渲染方法, 进一步提高了系统实时显示和交互性能。
本文方法中的炮检点数据全部存储于GPU端, 对显卡显存容量有相对较高的要求。今后将对炮检点实行分块组织, 研究“ 硬盘— 主存” 、“ 主存— 显存” 的多级数据缓冲机制和批量调度算法, 以便增强本文方法对复杂硬件环境的适应性。
The authors have declared that no competing interests exist.
[1] |
|
[2] |
|
[3] |
|
[4] |
|
[5] |
|
[6] |
|
[7] |
|
[8] |
|
[9] |
|
[10] |
|
[11] |
|
[12] |
|
[13] |
|
[14] |
|
[15] |
|
[16] |
|
[17] |
|
[18] |
|
[19] |
|
[20] |
|