基于曲面細(xì)分的地震數(shù)據(jù)三維顯示方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明屬于計(jì)算機(jī)圖形學(xué)和數(shù)據(jù)可視化領(lǐng)域,涉及一種基于曲面細(xì)分的地震數(shù)據(jù) 三維顯示方法。
【背景技術(shù)】
[0002] 隨著地震勘探技術(shù)的應(yīng)用與發(fā)展,勘探家對地震解釋成果的要求也越來越高。伴 隨著計(jì)算機(jī)硬件的發(fā)展,尤其是GPU的快速發(fā)展,地震數(shù)據(jù)三維顯示技術(shù)逐漸被人重視。傳 統(tǒng)的地震數(shù)據(jù)顯示方法:波形顯示、灰度變密度顯示以及彩色變密度顯示都屬于二維顯示 方法,不能提供多個(gè)角度觀察地震數(shù)據(jù),往往該類地震數(shù)據(jù)解釋系統(tǒng)會丟失很多細(xì)節(jié)。 [0003] 2008年Steven Lynch博士在他的博士論文《More than Meets the Eye_A Study in Seismic Visualization》提出了一種地震數(shù)據(jù)剖面三維顯示方法,Steven Lynch博士 把該方法分為三個(gè)步驟:網(wǎng)格化、光照以及顏色顯示。第一步的網(wǎng)格化是關(guān)鍵部分,由于GPU 植染單元為三角形,因此在地震數(shù)據(jù)網(wǎng)格化時(shí)需要指定相應(yīng)的頂點(diǎn)索引。Steven Lynch博 士在確定地震數(shù)據(jù)的頂點(diǎn)索引時(shí)出現(xiàn)了如下問題,如圖1所示,對于四個(gè)數(shù)據(jù)點(diǎn)組成的四邊 形,有兩種方式產(chǎn)生兩個(gè)渲染三角形單元,但是對于含有位置信息的頂點(diǎn)來說,這兩種連接 方式分別產(chǎn)生槽和脊,因此有時(shí)會對走勢明顯的地形產(chǎn)生破壞。如圖2所示,由于槽的存在, 使得地形走勢顯示錯(cuò)誤。
[0004] 1978年Edwin Catmull和Jim Clark提出經(jīng)典的Catmull-Clark曲面細(xì)分算法,由 于該算法的遞歸特性不適用于GPU編程,基于三角形的Loop細(xì)分算法也不適用GPU編程。近 些年一大批適用于GPU編程的曲面細(xì)分算法被提出,比如:2008年CHARLES LOOP和SCOTT SCHAEFER兩人于2008年提出了一種近似Catmull-Clark細(xì)分面的算法、同年Tamy Boubekeur提出的Phong細(xì)分算法。2009年微軟發(fā)布Directxll,Directxll帶來了細(xì)分曲面 管線,并且GPU在讀取頂點(diǎn)緩存時(shí)可以以面片的方式讀取,方便散亂點(diǎn)的曲面擬合以及曲面 細(xì)分算法的實(shí)現(xiàn)。
[0005] 地震數(shù)據(jù)采集時(shí),是在地面上布置一條條側(cè)線,按照一定的時(shí)間間隔進(jìn)行采樣,數(shù) 據(jù)是離散化保存,在進(jìn)行三維解釋的時(shí)候,近距離觀察地質(zhì)結(jié)構(gòu)時(shí)會發(fā)現(xiàn)嚴(yán)重的網(wǎng)格化,如 圖4所示。
【發(fā)明內(nèi)容】
[0006] 發(fā)明目的:以解決地震數(shù)據(jù)網(wǎng)格化時(shí)的索引連接問題以及近距離觀察時(shí)的網(wǎng)格化 問題。
[0007] 本發(fā)明包括:至少支持Directxll的GPU。
[0008] 本發(fā)明的特征在于,在計(jì)算機(jī)中是依次按以下步驟實(shí)現(xiàn)的:
[0009] 步驟(1),SEG-Y格式地震數(shù)據(jù)的解析:
[0010] SEG-Y格式是地震數(shù)據(jù)最為普遍的格式之一。一般包括三部分,分別為EB⑶1C文件 頭、二進(jìn)制文件頭以及地震道。用N表示數(shù)據(jù)體的第N道數(shù)據(jù)道,則第N道道頭和道數(shù)據(jù)讀取 位置分別為:
[0011] 3600+(N_l) (240+sample_num*data_size)
[0012] 3600+(Ν_1) (2400+sample_num*data_size)+240
[0013] SEG-Y結(jié)構(gòu)是一樣的,由于微機(jī)與和工作站的數(shù)據(jù)的存儲格式不同,工作站高字節(jié) 在前,低字節(jié)在后,而微機(jī)則是低字節(jié)在前,高字節(jié)在后。在數(shù)據(jù)讀取時(shí)需要進(jìn)行高、低位數(shù) 據(jù)交換。
[0014] 步驟(2),初始化頂點(diǎn)緩存:
[0015]自定義頂點(diǎn)結(jié)構(gòu),保存數(shù)據(jù)體的三維信息,從SEG-Y讀取數(shù)據(jù)到二維數(shù)組中,記為 data[trace_num] [sample_num]。采用三階貝塞爾曲面進(jìn)行數(shù)據(jù)點(diǎn)的擬合,三階貝塞爾曲面 的表達(dá)式為:
[0016]
[0017] 一個(gè)三階貝塞爾曲面片的確定需要16個(gè)控制點(diǎn),對于得到的二維數(shù)組數(shù)據(jù)源data
[trace_num] [sample_num],GPU在進(jìn)行讀取時(shí),是按照一維數(shù)組進(jìn)行讀取的,因此需要進(jìn)行 二維數(shù)組到一維數(shù)組的轉(zhuǎn)換,面片N與面片Μ左右相鄰,控制點(diǎn)分別記為:
[0018] Ν[0][0],Ν[1][0],Ν[2][0],Ν[3][0] Μ[0][0],Μ[1][0],Μ[2][0],Μ[3][0]
[0019] Ν[0][1],Ν[1][1],Ν[2][1],Ν[3][1] Μ[0][1],Μ[1][1],Μ[2][1],Μ[3][1]
[0020] Ν[0][2],Ν[1][2],Ν[2][2],Ν[3][2] Μ[0][2],Μ[1][2],Μ[2][2],Μ[3][2]
[0021] Ν[0][3],Ν[1][3],Ν[2][3],Ν[3][3] Μ[0][3],Μ[1][3],Μ[2][3],Μ[3][3]
[0022] 為了消除Ν與Μ之間的裂縫,則需要Ν與Μ面片都包含相鄰邊的數(shù)據(jù),因此Ν面片與Μ 面片消除裂縫的條件如下:
[0023] Μ[0][0]=Ν[3][0],Μ[0][1]=Ν[3][1],Μ[0][2]=Ν[3][2],Μ[0][3]=Ν[3][3]
[0024] 面片的空間關(guān)系可以分為上下左右四個(gè)方位,消除裂縫算法如下:
[0025] For: i = l ,4,7---trace_num-3
[0026] For: j = l ,4,7---sample_num-3
[0027] Rowl data:data[i_l][j_l],data[i+0][j_l],data[i+l][j_l],data[i+2][j_l]
[0028] Row2 data:data[i-l][j],data[i+0][j],data[i+l][j],data[i+2][j]
[0029] Row3 data:data[i-l][j+1],data[i+0][j+1],data[i+l][j+1],data[i+2][j+1]
[0030] Row4 data:data[i-l][j+2],data[i+0][j+2],data[i+l][j+2],data[i+2][j+2]
[0031] 步驟(3),創(chuàng)建頂點(diǎn)布局:
[0032] 在自定義頂點(diǎn)結(jié)構(gòu)中定義頂點(diǎn)的相關(guān)屬性,此處只需要一個(gè)三維坐標(biāo)信息,保存 地震數(shù)據(jù)點(diǎn)的位置信息。
[0033]步驟(4),設(shè)置圖元拓?fù)漕愋停?br>[0034] 用 1厶36七卩1';[111;[1:;^61'0卩01087設(shè)置
[0035] D3Dll_PRmiTIVE_T0P0L0GY_16_C0NTR0L_P0INT_PATCHLIST,使得 GPU 以面片的方 式讀取頂點(diǎn)緩存;
[0036] 為了能啟用Directxll的細(xì)分階段,設(shè)置Input Assembler的圖元拓?fù)漕愋?,使?接收的是控制面片的結(jié)構(gòu),用IASetPrimitiveTopology設(shè)置
[0037] D3Dll_PRmiTIVE_T0P0L0GY_16_C0NTR0L_P0INT_PATCHLIST,使得 GPU 以面片的方 式讀取頂點(diǎn)緩存。
[0038]步驟(5),曲面細(xì)分:
[0039] 準(zhǔn)備好頂點(diǎn)緩沖后,在GPU中實(shí)現(xiàn)曲面細(xì)分算法,GPU以
[0040] D3Dll_PRmiTIVE_T0P0L0GY_16_C0NTR0L_P0INT_PATCHLIST 組裝方式對輸入的頂 點(diǎn)緩存進(jìn)行讀取,對于給定的u,v,使用公式:
[0041]
[0042]求出細(xì)分得到的頂點(diǎn)的三維坐標(biāo)。具體步驟是:
[0043] 第一步:設(shè)置一個(gè)靜態(tài)緩沖來存儲每一幀繪制時(shí)需要用到的數(shù)據(jù),其中數(shù)據(jù)包括: 透視矩陣、攝像機(jī)位置、細(xì)分因子、地震數(shù)據(jù)最大幅值和地震數(shù)據(jù)最小幅值。
[0044] 第二步:Patch靜態(tài)函數(shù),程序?qū)τ?6個(gè)控制點(diǎn)組成的面片執(zhí)行一次,在該函數(shù)中 對每個(gè)面片的細(xì)分因子進(jìn)行設(shè)置,為第一步中確定的細(xì)分因子。
[0045]第三步:hull著色程序,對每個(gè)輸出控制點(diǎn)執(zhí)行一次,設(shè)置細(xì)分domain為四邊形, 輸出控制點(diǎn)的數(shù)量為16,并指定pa t ch函數(shù)為第二步中的pa t ch函數(shù)。
[0046] 第四步:domain著色程序,在該程序中對tessellator階段生成的頂點(diǎn)進(jìn)行定位, 使用公式
[0047]
[0048] 侍到東疋Ui,v)生你厄相膽tf」」兒9、生你。
[0049] 步驟(6),頂點(diǎn)顏色插值:
[0050] 在GPU的像素著色階進(jìn)行頂點(diǎn)顏色的確定,記步驟(5)第一步中得到的幅值最大值 最小值分別為MAX,MIN。對于給定頂點(diǎn)V的地震幅值Z,若其幅值為正,求Z與MAX比例,記為a, 則該頂點(diǎn)顏色為:(l_a,l_a,1)。若其幅值為負(fù),求Z與MIN比例,記為b,則該頂點(diǎn)顏色為:(1, 1 -b, 1-b) 〇
[0051] 本發(fā)明使用Directxll編程工具,基于三階貝塞爾曲面細(xì)分算法,實(shí)現(xiàn)了地震數(shù)據(jù) 的三維顯示方法。對于準(zhǔn)備好的頂點(diǎn)緩存,設(shè)置GPU以面片的方式組裝控制點(diǎn),因此不需要 索引緩存,從而省去了因確定索引緩沖而產(chǎn)生的槽和脊的問題。此外,基于GPU編程的曲面 細(xì)分技術(shù)的運(yùn)用,生成了更多的控制點(diǎn),使得網(wǎng)格的顯示更加細(xì)膩平滑并具有很好的實(shí)時(shí) 性。
【附圖說明】
[0052] 圖1為四個(gè)采樣點(diǎn),采用不同的方式會產(chǎn)生槽和脊 [0053 ]圖2為由于槽的存在,破壞了原有地形結(jié)構(gòu) [0054]圖3為進(jìn)行曲面細(xì)分后的效果圖
[0055]圖4為近距離觀察時(shí)的效果圖 [0056]圖5為曲面細(xì)分過后顯示效果圖 [0057]圖6為原始數(shù)據(jù)繪制得到的網(wǎng)格
[0058]圖7為細(xì)分因子為3時(shí)繪制得到的網(wǎng)格
[0059]圖8為基于曲面細(xì)分的地震數(shù)據(jù)三維顯示方法流程圖
[0060]圖9為SEG-Y文件數(shù)據(jù)格式示意圖
[0061]圖10為左右相鄰面片控制點(diǎn)不意圖
【具體實(shí)施方式】
[0062]下面結(jié)合附圖對本發(fā)明做進(jìn)一步的說明。
[0063]圖8是本發(fā)明的流程圖,在計(jì)算機(jī)中按如下步驟進(jìn)行:
[0064]步驟(1),SEG-Y格式地震數(shù)據(jù)的解析:
[0065] SEG-Y格式是地震數(shù)據(jù)一般包括三部分,分別為EB⑶1C文件頭、二進(jìn)制文件頭以及 地震道,如圖9所示。用N表示數(shù)據(jù)體的第N道數(shù)據(jù)道,則第N道道頭和道數(shù)據(jù)讀取位置分別 為:
[0066] 3600+(N_l) (240+sample_num*data_size)
[0067] 3600+(Ν_1) (2400+sample_num*data_size)+240
[0068] SEG-Y結(jié)構(gòu)是一樣的,由于微機(jī)與和工作站的數(shù)據(jù)的存儲格式不同,工作站高字節(jié) 在前,低字節(jié)在后,而微機(jī)則是低字節(jié)在前,高字節(jié)在后。在數(shù)據(jù)讀取時(shí)需要進(jìn)行高、低位數(shù) 據(jù)交換。
[0069]步驟(2),初始化頂點(diǎn)緩存:
[0070]自定義頂點(diǎn)結(jié)構(gòu),保存數(shù)據(jù)體的三維信息,從SEG-Y讀取數(shù)據(jù)到二維數(shù)組中。從二 維數(shù)組中初始化頂點(diǎn)緩沖。采用三階貝塞爾曲面進(jìn)行數(shù)據(jù)點(diǎn)的擬合。
[0071:
[0072] 對貝塞爾曲面求偏導(dǎo)數(shù),得到偏導(dǎo)數(shù)可以很方便的求解頂點(diǎn)的法向量。得到法向 量后可以進(jìn)行地震數(shù)據(jù)網(wǎng)格的光照顯示。偏導(dǎo)數(shù)公式如下:
[0073]
[0074]
[0075] 一個(gè)三階貝塞爾曲面片的確定需要16個(gè)控制點(diǎn),對于得到的二維數(shù)組數(shù)據(jù)