源data [trace_num] [sample_num],GPU在進行讀取時,是按照一維數(shù)組進行讀取的,因此需要進行 二維數(shù)組到一維數(shù)組的轉(zhuǎn)換,面片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] 為了消除Ν與Μ之間的裂縫,則需要Ν與Μ面片都包含相鄰邊的數(shù)據(jù),因此Ν面片與Μ 面片消除裂縫的條件如下:
[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]面片的空間關(guān)系可以分為上下左右四個方位,消除裂縫算法如下:
[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),創(chuàng)建頂點布局:
[0091] 在自定義定點結(jié)構(gòu)中定義頂點的相關(guān)屬性,此處只需要一個三維坐標(biāo)信息,保存 地震數(shù)據(jù)點的位置信息。
[0092]步驟(4),設(shè)置圖元拓撲類型:
[0093] 為了能啟用Directxll的細分階段,設(shè)置Input Assembler的圖元拓撲類型,使其 接收的是控制面片的結(jié)構(gòu),用 IASetPrimitiveTopology 設(shè)置 D3Dll_PRn〇TIVE_T0P0L0GY_ 16_C0NTR0L_P01NT_PATCHLI ST,使得GPU以面片的方式讀取頂點緩存。
[0094] Directxl 1是微軟公司2009年提供的多媒體編程接口,為了能啟用Directxl 1的細 分階段,需要設(shè)置Input Assembler階段的圖元拓撲類型,使其接收的是控制面片的結(jié)構(gòu), 在CPU代碼中使用IASetPrimitiveTopology函數(shù)來設(shè)置GPU以面片的方式讀取頂點緩存, Directxll提供了新的圖元使得可以設(shè)置GPU以面片的方式組裝頂點。
[0095]步驟(5),曲面細分:
[0096] 準(zhǔn)備好頂點緩沖后,在GPU中實現(xiàn)曲面細分算法,GPU以
[0097] D3Dll_PRmiTIVE_T0P0L0GY_16_C0NTR0L_P0INT_PATCHLIST 組裝方式對輸入的頂 點緩存進行讀取,對于給定的u,v,使用公式:
[0098
[0099]求出細分得到的頂點的三維坐標(biāo)。具體步驟是:
[0100] 第一步:設(shè)置一個靜態(tài)緩沖來存儲每一幀繪制時需要用到的數(shù)據(jù),其中數(shù)據(jù)包括: 透視矩陣、攝像機位置、細分因子、地震數(shù)據(jù)最大幅值和地震數(shù)據(jù)最小幅值。
[0101] 第二步:patch靜態(tài)函數(shù),程序?qū)τ?6個控制點組成的面片執(zhí)行一次,在該函數(shù)中 對每個面片的細分因子進行設(shè)置,為第一步中確定的細分因子。
[0102] 第三步:hull著色程序,對每個輸出控制點執(zhí)行一次,設(shè)置細分domain為四邊形, 輸出控制點的數(shù)量為16,并指定pa t ch函數(shù)為第二步中的pa t ch函數(shù)。
[0103] 第四步:domain著色程序,在該程序中對tessellator階段生成的頂點進行定位, 使用公式
[0104]
[0105] 得到給定(u,v)坐標(biāo)后相應(yīng)的頂點坐標(biāo)。
[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] 經(jīng)過以上步驟后,實現(xiàn)了基于曲面細分的地震數(shù)據(jù)三維顯示方法,圖3展示了進行 曲面細分后的顯示效果,與圖2相比,正確的顯示出原有的地形走勢。圖4與圖5在同一觀察 距離對地震數(shù)據(jù)進行觀察,圖5的顯示效果明顯更加細膩平滑。由對比可知,基于曲面細分 的地震數(shù)據(jù)三維顯示方法很好的解決了因確定索引緩沖而產(chǎn)生的槽和脊的問題以及近距 離觀察的網(wǎng)格化問題。
【主權(quán)項】
1.基于曲面細分的地震數(shù)據(jù)三維顯示方法;其特征在于,按以下步驟實現(xiàn)的: 步驟(1),SEG-Y格式地震數(shù)據(jù)的解析: SEG-Y格式是地震數(shù)據(jù)最為普遍的格式之一;包括三部分,分別為EB⑶1C文件頭、二進 制文件頭以及地震道;用N表示數(shù)據(jù)體的第N道數(shù)據(jù)道,則第N道道頭和道數(shù)據(jù)讀取位置分別 為: 3600+(N_l)(240+sample_num*data_size) 3600+(Ν_1)(2400+sample_num*data_size)+240 其中,sample_num表示SEG-Y格式數(shù)據(jù)的采樣點數(shù),data_size表示存儲一個數(shù)據(jù)點所 占的字節(jié)數(shù); SEG-Y格式是統(tǒng)一的,但由于微機和工作站的數(shù)據(jù)的存儲格式不同,工作站高字節(jié)在 前,低字節(jié)在后,而微機則是低字節(jié)在前,高字節(jié)在后;在數(shù)據(jù)讀取時需要進行高、低位數(shù)據(jù) 交換; 步驟(2),初始化頂點緩存: 自定義頂點結(jié)構(gòu),保存數(shù)據(jù)體的三維信息,從SEG-Y讀取數(shù)據(jù)到二維數(shù)組中,保存數(shù)據(jù) 的二維數(shù)組記為data[ trace_num] [ sample_num],其中trace_num表示SEG-Y地震數(shù)據(jù)總地 震道數(shù),Sample_num表示采樣點數(shù);采用三階貝塞爾曲面進行數(shù)據(jù)點的擬合,三階貝塞爾曲 面的表達式為:其中,釋轉(zhuǎn),管神表示伯恩斯坦多項式,表達式如下:一個三階貝塞爾曲面片的確定需要16個控制點,對于得到的二維數(shù)組數(shù)據(jù)源data [trace_num] [sample_num],GPU在進行讀取時,是按照一維數(shù)組進行讀取的,因此需要進行 二維數(shù)組到一維數(shù)組的轉(zhuǎn)換,面片N與面片Μ左右相鄰,控制點分別記為:為了消除Ν與Μ之間的裂縫,則需要Ν與Μ面片都包含相鄰邊的數(shù)據(jù),因此Ν面片與Μ面片 消除裂縫的條件如下: Μ[0][0]=Ν[3][0],Μ[0][1]=Ν[3][1],Μ[0][2]=Ν[3][2],Μ[0][3]=Ν[3][3] 面片的空間關(guān)系分為上下左右四個方位,消除裂縫算法如下: 設(shè)i為當(dāng)前地震道數(shù),取值為1,4,7…trace_num-3,對于給定的地震道i,j表示采樣點 數(shù),取值為1,4,7···sample_num-3;對于給定的i,j,為了確定由16個頂點組成的面片,其中 16個頂點共分為4行,每行由4個頂點組成,則有: 第一行頂點數(shù)據(jù):data[i_l][ j-1],data[i+0][ j-1],data[i + l][ j-1],data[i+2][ j- 1] 第二行頂點數(shù)據(jù):data[i_l][ j],data[i+0][ j],data[i+l][ j],data[i+2][ j] 第三行頂點數(shù)據(jù):data[i_l][ j+1],data[i+0][ j+1],data[i + l][ j+1],data[i+2][ j+ 1] 第四行頂點數(shù)據(jù):data[i_l][ j+2],data[i+0][ j+2],data[i + l][ j+2],data[i+2][ j+ 2] 步驟(3),創(chuàng)建頂點布局: 在自定義頂點結(jié)構(gòu)中定義頂點的相關(guān)屬性,此處只需要一個三維坐標(biāo)信息,保存地震 數(shù)據(jù)點的位置信息; 步驟(4),設(shè)置圖元拓撲類型: 用 IASetPrimitiveTopology 設(shè)置 D3D11_PRIMITIVE_T0P0L0GY_16_C0NTR0L_P0INT_ PATCHLIST,使得GPU以面片的方式讀取頂點緩存;D3D11_PRIMITIVE_T0P0L0GY_16_ CONTROL_POINT_PATCHLIST表示GPU會用以16個頂點組成的面片作為一個圖元進行組裝; 步驟(5),曲面細分: 準(zhǔn)備好頂點緩沖后,在GRJ中實現(xiàn)曲面細分算法, D3D11_PRMITIVE_T0P0L0GY_16_C0NTR0L_P0INT_PATCHLIST 組裝方式對輸入的頂點緩 存進行讀取,設(shè)u,v為曲面參數(shù),取值范圍為[0,1],對于給定的u,v使用公式:求出細分得到的頂點的三維坐標(biāo);具體步驟是: 第一步:設(shè)置一個靜態(tài)緩存來存儲每一幀繪制時需要用到的數(shù)據(jù),其中數(shù)據(jù)包括:透視 矩陣、攝像機位置、細分因子、地震數(shù)據(jù)最大幅值和地震數(shù)據(jù)最小幅值; 第二步:patch靜態(tài)函數(shù),該函數(shù)對每個由16個控制點組成的面片執(zhí)行一次,在該函數(shù) 中對每個面片的細分因子進行設(shè)置,該值為第一步中確定的細分因子取值; 第三步:hull著色程序,該程序?qū)γ總€輸出控制點執(zhí)行一次,設(shè)置細分domain為四邊 形,輸出控制點的數(shù)量為16,并指定pa t ch函數(shù)為第二步中的pa t ch函數(shù); 第四步:domain著色程序,在該程序中對tessellator生成的頂點進行定位,使用公式:得到給定(u,v)取值后相應(yīng)的頂點的坐標(biāo); 步驟(6),頂點顏色插值: 在GHJ的像素著色階進行頂點顏色的確定,記步驟(5)第一步中得到的幅值最大值最小 值分別為MAX,MIN;對于給定頂點V的地震幅值Z,若其幅值為正,求Z與MAX比例,記為a,則該 頂點顏色為:(l_a,1-a,1);若其幅值為負,求Z與MIN比例,記為b,則該頂點顏色為:(1,Ι-b, l_b) 〇
【專利摘要】本發(fā)明屬于計算機圖形學(xué)和數(shù)據(jù)可視化領(lǐng)域,涉及一種基于曲面細分的地震數(shù)據(jù)三維顯示方法。本發(fā)明使用Directx11編程工具,基于三階貝塞爾曲面細分算法,實現(xiàn)了地震數(shù)據(jù)的三維顯示方法。對于準(zhǔn)備好的頂點緩存,設(shè)置GPU以面片的方式組裝控制點,因此不需要索引緩存,從而省去了因確定索引緩沖而產(chǎn)生的槽和脊的問題。此外,基于GPU編程的曲面細分技術(shù)的運用,生成了更多的控制點,使得網(wǎng)格的顯示更加細膩平滑并具有很好的實時性。
【IPC分類】G01V1/34
【公開號】CN105676290
【申請?zhí)枴緾N201610204785
【發(fā)明人】何震震, 肖創(chuàng)柏, 禹晶
【申請人】北京工業(yè)大學(xué)
【公開日】2016年6月15日
【申請日】2016年4月3日