基于曲面细分的地震数据三维显示方法_2

文档序号:9909742阅读:来源:国知局
源data [trace_num] [sample_num],GPU在进行读取时,是按照一维数组进行读取的,因此需要进行 二维数组到一维数组的转换,面片N与面片Μ左右相邻,控制点分别记为:
[0076] Ν[0][0],Ν[1][0],Ν[2][0],Ν[3][0] Μ[0][0],Μ[1][0],Μ[2][0],Μ[3][0]
[0077] Ν[0][1],Ν[1][1],Ν[2][1],Ν[3][1] Μ[0][1],Μ[1][1],Μ[2][1],Μ[3][1]
[0078] Ν[0][2],Ν[1][2],Ν[2][2],Ν[3][2] Μ[0][2],Μ[1][2],Μ[2][2],Μ[3][2]
[0079] Ν[0][3],Ν[1][3],Ν[2][3],Ν[3][3] Μ[0][3],Μ[1][3],Μ[2][3],Μ[3][3]
[0080] 为了消除Ν与Μ之间的裂缝,则需要Ν与Μ面片都包含相邻边的数据,因此Ν面片与Μ 面片消除裂缝的条件如下:
[0081] M[0][0]=N[3][0],M[0][1]=N[3][1],M[0][2]=N[3][2],M[0][3]=N[3][3]
[0082] 如图10所示,面片N与面片M左右相邻,因此第四列显示为x的顶点在顶点初始化时 为两个面片共享。
[0083]面片的空间关系可以分为上下左右四个方位,消除裂缝算法如下:
[0084] For: i = l ,4,7---trace_num-3
[0085] For: j = l ,4,7---sample_num-3
[0086] Rowl data:data[i_l][j_l],data[i+0][j_l],data[i+l][j_l],data[i+2][j_l]
[0087] Row2 data:data[i-l][j],data[i+0][j],data[i+l][j],data[i+2][j]
[0088] Row3 data:data[i-l][j+1],data[i+0][j+1],data[i+l][j+1],data[i+2][j+1]
[0089] Row4 data:data[i-l][j+2],data[i+0][j+2],data[i+l][j+2],data[i+2][j+2]
[0090] 步骤(3),创建顶点布局:
[0091] 在自定义定点结构中定义顶点的相关属性,此处只需要一个三维坐标信息,保存 地震数据点的位置信息。
[0092]步骤(4),设置图元拓扑类型:
[0093] 为了能启用Directxll的细分阶段,设置Input Assembler的图元拓扑类型,使其 接收的是控制面片的结构,用 IASetPrimitiveTopology 设置 D3Dll_PRn〇TIVE_T0P0L0GY_ 16_C0NTR0L_P01NT_PATCHLI ST,使得GPU以面片的方式读取顶点缓存。
[0094] Directxl 1是微软公司2009年提供的多媒体编程接口,为了能启用Directxl 1的细 分阶段,需要设置Input Assembler阶段的图元拓扑类型,使其接收的是控制面片的结构, 在CPU代码中使用IASetPrimitiveTopology函数来设置GPU以面片的方式读取顶点缓存, Directxll提供了新的图元使得可以设置GPU以面片的方式组装顶点。
[0095]步骤(5),曲面细分:
[0096] 准备好顶点缓冲后,在GPU中实现曲面细分算法,GPU以
[0097] D3Dll_PRmiTIVE_T0P0L0GY_16_C0NTR0L_P0INT_PATCHLIST 组装方式对输入的顶 点缓存进行读取,对于给定的u,v,使用公式:
[0098
[0099]求出细分得到的顶点的三维坐标。具体步骤是:
[0100] 第一步:设置一个静态缓冲来存储每一帧绘制时需要用到的数据,其中数据包括: 透视矩阵、摄像机位置、细分因子、地震数据最大幅值和地震数据最小幅值。
[0101] 第二步:patch静态函数,程序对由16个控制点组成的面片执行一次,在该函数中 对每个面片的细分因子进行设置,为第一步中确定的细分因子。
[0102] 第三步:hull着色程序,对每个输出控制点执行一次,设置细分domain为四边形, 输出控制点的数量为16,并指定pa t ch函数为第二步中的pa t ch函数。
[0103] 第四步:domain着色程序,在该程序中对tessellator阶段生成的顶点进行定位, 使用公式
[0104]
[0105] 得到给定(u,v)坐标后相应的顶点坐标。
[0106] 步骤(6),顶点颜色插值:
[0107] 在GPU的像素着色阶进行顶点颜色的确定,记步骤(5)第一步中得到的幅值最大值 最小值分别为MAX,MIN。对于给定顶点V的地震幅值Z,若其幅值为正,求Z与MAX比例,记为a, 则该顶点颜色为:(l_a,l_a,1)。若其幅值为负,求Z与MIN比例,记为b,则该顶点颜色为:(1, 1 -b, 1-b) 〇
[0108] 经过以上步骤后,实现了基于曲面细分的地震数据三维显示方法,图3展示了进行 曲面细分后的显示效果,与图2相比,正确的显示出原有的地形走势。图4与图5在同一观察 距离对地震数据进行观察,图5的显示效果明显更加细腻平滑。由对比可知,基于曲面细分 的地震数据三维显示方法很好的解决了因确定索引缓冲而产生的槽和脊的问题以及近距 离观察的网格化问题。
【主权项】
1.基于曲面细分的地震数据三维显示方法;其特征在于,按以下步骤实现的: 步骤(1),SEG-Y格式地震数据的解析: SEG-Y格式是地震数据最为普遍的格式之一;包括三部分,分别为EB⑶1C文件头、二进 制文件头以及地震道;用N表示数据体的第N道数据道,则第N道道头和道数据读取位置分别 为: 3600+(N_l)(240+sample_num*data_size) 3600+(Ν_1)(2400+sample_num*data_size)+240 其中,sample_num表示SEG-Y格式数据的采样点数,data_size表示存储一个数据点所 占的字节数; SEG-Y格式是统一的,但由于微机和工作站的数据的存储格式不同,工作站高字节在 前,低字节在后,而微机则是低字节在前,高字节在后;在数据读取时需要进行高、低位数据 交换; 步骤(2),初始化顶点缓存: 自定义顶点结构,保存数据体的三维信息,从SEG-Y读取数据到二维数组中,保存数据 的二维数组记为data[ trace_num] [ sample_num],其中trace_num表示SEG-Y地震数据总地 震道数,Sample_num表示采样点数;采用三阶贝塞尔曲面进行数据点的拟合,三阶贝塞尔曲 面的表达式为:其中,釋轉,管神表示伯恩斯坦多项式,表达式如下:一个三阶贝塞尔曲面片的确定需要16个控制点,对于得到的二维数组数据源data [trace_num] [sample_num],GPU在进行读取时,是按照一维数组进行读取的,因此需要进行 二维数组到一维数组的转换,面片N与面片Μ左右相邻,控制点分别记为:为了消除Ν与Μ之间的裂缝,则需要Ν与Μ面片都包含相邻边的数据,因此Ν面片与Μ面片 消除裂缝的条件如下: Μ[0][0]=Ν[3][0],Μ[0][1]=Ν[3][1],Μ[0][2]=Ν[3][2],Μ[0][3]=Ν[3][3] 面片的空间关系分为上下左右四个方位,消除裂缝算法如下: 设i为当前地震道数,取值为1,4,7…trace_num-3,对于给定的地震道i,j表示采样点 数,取值为1,4,7···sample_num-3;对于给定的i,j,为了确定由16个顶点组成的面片,其中 16个顶点共分为4行,每行由4个顶点组成,则有: 第一行顶点数据:data[i_l][ j-1],data[i+0][ j-1],data[i + l][ j-1],data[i+2][ j- 1] 第二行顶点数据:data[i_l][ j],data[i+0][ j],data[i+l][ j],data[i+2][ j] 第三行顶点数据:data[i_l][ j+1],data[i+0][ j+1],data[i + l][ j+1],data[i+2][ j+ 1] 第四行顶点数据:data[i_l][ j+2],data[i+0][ j+2],data[i + l][ j+2],data[i+2][ j+ 2] 步骤(3),创建顶点布局: 在自定义顶点结构中定义顶点的相关属性,此处只需要一个三维坐标信息,保存地震 数据点的位置信息; 步骤(4),设置图元拓扑类型: 用 IASetPrimitiveTopology 设置 D3D11_PRIMITIVE_T0P0L0GY_16_C0NTR0L_P0INT_ PATCHLIST,使得GPU以面片的方式读取顶点缓存;D3D11_PRIMITIVE_T0P0L0GY_16_ CONTROL_POINT_PATCHLIST表示GPU会用以16个顶点组成的面片作为一个图元进行组装; 步骤(5),曲面细分: 准备好顶点缓冲后,在GRJ中实现曲面细分算法, D3D11_PRMITIVE_T0P0L0GY_16_C0NTR0L_P0INT_PATCHLIST 组装方式对输入的顶点缓 存进行读取,设u,v为曲面参数,取值范围为[0,1],对于给定的u,v使用公式:求出细分得到的顶点的三维坐标;具体步骤是: 第一步:设置一个静态缓存来存储每一帧绘制时需要用到的数据,其中数据包括:透视 矩阵、摄像机位置、细分因子、地震数据最大幅值和地震数据最小幅值; 第二步:patch静态函数,该函数对每个由16个控制点组成的面片执行一次,在该函数 中对每个面片的细分因子进行设置,该值为第一步中确定的细分因子取值; 第三步:hull着色程序,该程序对每个输出控制点执行一次,设置细分domain为四边 形,输出控制点的数量为16,并指定pa t ch函数为第二步中的pa t ch函数; 第四步:domain着色程序,在该程序中对tessellator生成的顶点进行定位,使用公式:得到给定(u,v)取值后相应的顶点的坐标; 步骤(6),顶点颜色插值: 在GHJ的像素着色阶进行顶点颜色的确定,记步骤(5)第一步中得到的幅值最大值最小 值分别为MAX,MIN;对于给定顶点V的地震幅值Z,若其幅值为正,求Z与MAX比例,记为a,则该 顶点颜色为:(l_a,1-a,1);若其幅值为负,求Z与MIN比例,记为b,则该顶点颜色为:(1,Ι-b, l_b) 〇
【专利摘要】本发明属于计算机图形学和数据可视化领域,涉及一种基于曲面细分的地震数据三维显示方法。本发明使用Directx11编程工具,基于三阶贝塞尔曲面细分算法,实现了地震数据的三维显示方法。对于准备好的顶点缓存,设置GPU以面片的方式组装控制点,因此不需要索引缓存,从而省去了因确定索引缓冲而产生的槽和脊的问题。此外,基于GPU编程的曲面细分技术的运用,生成了更多的控制点,使得网格的显示更加细腻平滑并具有很好的实时性。
【IPC分类】G01V1/34
【公开号】CN105676290
【申请号】CN201610204785
【发明人】何震震, 肖创柏, 禹晶
【申请人】北京工业大学
【公开日】2016年6月15日
【申请日】2016年4月3日
当前第2页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1