專利名稱:基于分塊策略的大規(guī)模數(shù)據(jù)場(chǎng)體繪制方法
技術(shù)領(lǐng)域:
本發(fā)明屬于圖像處理技術(shù)領(lǐng)域,特別涉及基于GPU的圖形處理方法,可用于科學(xué)計(jì)算、醫(yī)學(xué)影像、地震勘測(cè)、氣象及有限元分析等領(lǐng)域中的大規(guī)模體數(shù)據(jù)快速繪制。
背景技術(shù):
隨著現(xiàn)代科技的發(fā)展,人們需要處理的數(shù)據(jù)越來(lái)越復(fù)雜,這一事實(shí)增加了人們對(duì)計(jì)算機(jī)輔助可視化的需求。故在二十世紀(jì)八十年代,科學(xué)計(jì)算可視化作為一門獨(dú)立的學(xué)科被提出來(lái)。1987年2月,美國(guó)國(guó)家科學(xué)基金會(huì)在華盛頓召開了有關(guān)科學(xué)計(jì)算可視化的首次會(huì)議,與會(huì)者有來(lái)自計(jì)算機(jī)圖形學(xué)、圖像處理以及從事各個(gè)不同領(lǐng)域的專家。會(huì)議認(rèn)為“將圖形和圖像技術(shù)應(yīng)用于科學(xué)計(jì)算是一個(gè)全新的領(lǐng)域”,并指出“科學(xué)家們不僅需要分析由計(jì)算機(jī)得出的計(jì)算數(shù)據(jù),而且需要了解在計(jì)算過(guò)程中數(shù)據(jù)的變化,而這些都需要借助計(jì)算機(jī)圖形學(xué)及圖像處理技術(shù)”。會(huì)議將這一涉及到多個(gè)學(xué)科的領(lǐng)域定名為科學(xué)計(jì)算可視化,英文為Visualization in Scientific Computing,簡(jiǎn)稱科學(xué)可視化,英文為Scientific Visualization。它是利用計(jì)算機(jī)圖形學(xué)、數(shù)字圖像處理、計(jì)算機(jī)視覺及數(shù)字信號(hào)處理等學(xué)科的理論與方法,將科學(xué)計(jì)算、工程學(xué)、醫(yī)學(xué)等計(jì)算、測(cè)量過(guò)程中的符號(hào)、數(shù)字等信息轉(zhuǎn)換為直觀的圖形圖像并在屏幕上顯示出來(lái)的理論、技術(shù)和方法。
目前科學(xué)可視化方法主要集中為以下兩類 第一類是面繪制方法。面繪制以傳統(tǒng)的計(jì)算機(jī)圖形學(xué)為基礎(chǔ),通過(guò)閾值方法由3D數(shù)據(jù)場(chǎng)構(gòu)造中間幾何圖元并生成最終圖像。面繪制算法中,主要有立方塊法Cuberille、移動(dòng)立方體法MC和移動(dòng)四面體法MT等。而Lorensen等人1987年提出的移動(dòng)立方體法是最有影響的等值面構(gòu)造方法,一直沿用至今。該方法首先由給定的閾值將每個(gè)體素的8個(gè)角點(diǎn)的數(shù)值二值化,然后根據(jù)二值化后的8個(gè)頂點(diǎn)的拓?fù)潢P(guān)系,分15種情況進(jìn)行等值面的匹配生成處理。該方法可以快速生成等值面。最初的MC算法不能保證三角片所構(gòu)成的等值面的拓?fù)湟恢滦裕瑫?huì)造成等值面上出現(xiàn)孔隙。Durst MJ首先提出了MC算法中的二義性,后來(lái)許多研究人員在Lorensen方法的基礎(chǔ)上做改進(jìn)工作。移動(dòng)四面體法是在MC算法的基礎(chǔ)上發(fā)展起來(lái)的,該算法首先將立方體剖分成四面體,然后在其中構(gòu)造等值面。進(jìn)行四面體剖分后,等值面在四面體中的剖分模式減少,算法實(shí)現(xiàn)簡(jiǎn)單。其次,構(gòu)造的等值面較MC算法構(gòu)造的等值面精度高。而最直接的原因是企圖通過(guò)在四面體內(nèi)構(gòu)造等值面來(lái)避免MC算法中存在二義性問(wèn)題。面繪制將感興趣的部分以等值面的方式抽取后,可利用真實(shí)感技術(shù)生成高質(zhì)量的圖像,使研究人員可以方便地進(jìn)行觀察和分析。但這種方法每次只能顯示一個(gè)值的等值面,且需要借助于幾何圖元表示,不能反映整體體數(shù)據(jù)中各種因素的相互關(guān)系,使研究人員難以把握體數(shù)據(jù)的全局狀況。體數(shù)據(jù)所包含的物體結(jié)構(gòu)一般都是復(fù)雜而細(xì)膩的,如人體器官和軟組織等,很難用幾何圖元來(lái)準(zhǔn)確描述。另外,面繪制不能保留原有體數(shù)據(jù)的一些物理屬性,舍棄了物體內(nèi)部的大量有用信息,不利于進(jìn)一步處理。
第二類是體繪制方法。體繪制方法與面繪制方法不同,不需要進(jìn)行幾何圖元的提取過(guò)程來(lái)恢復(fù)體數(shù)據(jù)中的物體表面,而是直接由3D體數(shù)據(jù)產(chǎn)生屏幕上的2D圖像。它的中心思想是為每一個(gè)體素指定一個(gè)阻光度,并考慮每一個(gè)體素對(duì)光線的透射、發(fā)射和反射作用。光線的透射取決于體素的不透明度;光線的發(fā)射則取決于體素的物質(zhì)度,物質(zhì)度愈大,其發(fā)射光愈強(qiáng);光線的反射則取決于體素所在的面與入射光的夾角關(guān)系。體繪制的步驟原則上可分為投射、消隱、渲染和合成等4個(gè)步驟。經(jīng)過(guò)二十多年的發(fā)展,已經(jīng)有多種體繪制算法被提出。按照繪制前是否需要對(duì)原始的體數(shù)據(jù)進(jìn)行預(yù)處理,可將其分為直接體繪制方法和變換域體繪制方法兩大類。直接體繪制方法都是在空間域?qū)w數(shù)據(jù)直接采樣。變換域體繪制方法首先將體數(shù)據(jù)從空域變換到另外的域,例如壓縮域、頻域或小波域,然后直接在這些變換后的域中進(jìn)行采樣混合。與面繪制方法只能顯示物體的輪廓和形狀相比,體繪制算法能產(chǎn)生體數(shù)據(jù)的整體圖像,且圖像質(zhì)量較高,包括體數(shù)據(jù)內(nèi)部的每一個(gè)細(xì)節(jié),因此體繪制方法在實(shí)際應(yīng)用中越來(lái)越廣泛。
體繪制方法強(qiáng)調(diào)對(duì)整體信息的顯示和理解。由于體繪制方法需要一次性處理體數(shù)據(jù)場(chǎng)全部的數(shù)據(jù)單元,涉及到的數(shù)據(jù)量龐大,導(dǎo)致計(jì)算量較大,顯示速度較慢。隨著PC機(jī)上的圖形處理單元GPU的出現(xiàn)和發(fā)展,利用GPU強(qiáng)大的圖形處理能力與體繪制算法結(jié)合,能加快繪制速度,實(shí)現(xiàn)對(duì)體數(shù)據(jù)的實(shí)時(shí)繪制。因此基于GPU的體繪制方法成為目前體繪制領(lǐng)域的研究熱點(diǎn)。但該類方法需要將體數(shù)據(jù)轉(zhuǎn)換為3D紋理保存在GPU的紋理內(nèi)存中。當(dāng)GPU的紋理內(nèi)存小于體數(shù)據(jù)規(guī)模時(shí),難以進(jìn)行處理。對(duì)此,Guthe等提出利用小波變換對(duì)體數(shù)據(jù)進(jìn)行壓縮,Schneider等提出采用矢量量化技術(shù)對(duì)體數(shù)據(jù)進(jìn)行壓縮,Weiler等提出一種多分辨率表示體數(shù)據(jù)的方法,但此類方法都會(huì)降低最終繪制圖像的質(zhì)量。Kai Xie等提出了一種分塊與可視檢測(cè)結(jié)合的方法VT,該方法在不降低繪制圖像質(zhì)量的同時(shí),實(shí)現(xiàn)大規(guī)模體數(shù)據(jù)的繪制,但在繪制時(shí)切換紋理過(guò)于頻繁,性能較低。
發(fā)明內(nèi)容
本發(fā)明的目的在于克服基于GPU的體繪制方法存在的存儲(chǔ)容量瓶頸,提供一種基于分塊策略的大規(guī)模數(shù)據(jù)場(chǎng)體繪制方法,以實(shí)現(xiàn)在GPU架構(gòu)上快速繪制大規(guī)模體數(shù)據(jù),有效地提高處理的數(shù)據(jù)量。
實(shí)現(xiàn)本發(fā)明目的的技術(shù)方案包括如下 (1)對(duì)計(jì)算機(jī)內(nèi)存中待處理的整體體數(shù)據(jù)進(jìn)行分塊規(guī)劃,生成大小相等的多個(gè)子塊,并對(duì)生成的每個(gè)子塊編號(hào); (2)在視口坐標(biāo)系下,計(jì)算生成的每個(gè)子塊與視平面之間的距離,并根據(jù)該距離,按從后向前對(duì)子塊進(jìn)行排序; (3)利用八叉樹結(jié)構(gòu)組織子塊內(nèi)的體數(shù)據(jù),并通過(guò)遍歷八叉樹排除對(duì)最終繪制結(jié)果無(wú)貢獻(xiàn)的無(wú)效體數(shù)據(jù); (4)對(duì)利用八叉樹組織后的子塊,依次作為3D紋理載入到紋理內(nèi)存中; (5)對(duì)紋理內(nèi)存中的每個(gè)子塊,利用3D紋理體繪制算法進(jìn)行繪制,得到每個(gè)子塊的繪制結(jié)果; (6)對(duì)每個(gè)子塊的繪制結(jié)果,在幀緩存中按從后向前的順序混合,得到整體體數(shù)據(jù)的繪制圖像。
所述的八叉樹數(shù)據(jù)結(jié)構(gòu)如下 Struct OctreeNode { unsigned intXCode,YCode,ZCode; //八叉樹結(jié)點(diǎn)的方向編碼 int MinValue,MaxValue;//八叉樹結(jié)點(diǎn)的最大最小值 OctreeNode* Children[8]; //八叉樹結(jié)點(diǎn)的子結(jié)點(diǎn) } 上述數(shù)據(jù)結(jié)構(gòu)中,MaxValue和MinValue存儲(chǔ)對(duì)應(yīng)子體數(shù)據(jù)內(nèi)所有體素的最大最小值,指針Children[i]指向當(dāng)前結(jié)點(diǎn)的第i個(gè)子結(jié)點(diǎn),方向編碼XCode、YCode和ZCode包含了子體數(shù)據(jù)的剖分深度及空間位置信息 icoord=(c1×2-1+c2×2-2+c3×2-3+...+cn×2-n)×IWidth iwidth=2-depth×IWidth=2-n×IWidth 式中,icoord表示子體數(shù)據(jù)在原始體數(shù)據(jù)中在某個(gè)坐標(biāo)軸方向上的起始坐標(biāo),IWidth表示原始體數(shù)據(jù)在某個(gè)坐標(biāo)軸方向上的寬度,iwidth表示子數(shù)據(jù)在某個(gè)坐標(biāo)軸方向上的寬度,c1c2c3...cn為八叉樹結(jié)點(diǎn)沿某坐標(biāo)方向的方向編碼,depth為結(jié)點(diǎn)沿某坐標(biāo)方向的剖分深度。
所述的對(duì)排序后利用八叉樹進(jìn)行組織的子塊,依次作為3D紋理載入到紋理內(nèi)存,是在載入新子塊時(shí),采用紋理替換,直接用該子塊內(nèi)的體數(shù)據(jù)替換當(dāng)前紋理中的數(shù)據(jù),以避免頻繁的紋理刪除和創(chuàng)建帶來(lái)的開銷。
本發(fā)明由于采用分塊策略的方法對(duì)整體體數(shù)據(jù)進(jìn)行分解,利用八叉樹結(jié)構(gòu)組織體數(shù)據(jù),與現(xiàn)有技術(shù)相比較,具有以下優(yōu)點(diǎn) (1)利用分塊策略對(duì)整體體數(shù)據(jù)分塊,克服了基于GPU的體繪制算法存在的存儲(chǔ)瓶頸; (2)采用紋理替換技術(shù)載入體數(shù)據(jù)到紋理內(nèi)存中,避免了頻繁刪除和創(chuàng)建紋理帶來(lái)的開銷; (3)利用八叉樹排除了對(duì)最終繪制結(jié)果的不做貢獻(xiàn)的無(wú)效體數(shù)據(jù),加快了處理整體體數(shù)據(jù)的過(guò)程; (4)采用快速計(jì)算采樣多邊形與有效體數(shù)據(jù)的交點(diǎn)坐標(biāo)的方法,加快了3D紋理映射體繪制方法繪制體數(shù)據(jù)的速度。
圖1為本發(fā)明處理整體體數(shù)據(jù)的過(guò)程示意圖; 圖2為本發(fā)明中原始體數(shù)據(jù)在內(nèi)存中的存儲(chǔ)方式示意圖; 圖3為本發(fā)明中對(duì)體數(shù)據(jù)分塊后的存儲(chǔ)方式示意圖; 圖4為本發(fā)明中空間劃分及保留邊界劃分的采樣示意圖; 圖5為本發(fā)明中八叉樹組織體數(shù)據(jù)示意圖; 圖6為本發(fā)明與直接繪制方法在結(jié)果圖像上的效果比較圖; 圖7為本發(fā)明繪制幾種實(shí)驗(yàn)數(shù)據(jù)的效果圖; 圖8為本發(fā)明與現(xiàn)有方法在跳過(guò)無(wú)效體數(shù)據(jù)上的數(shù)量比較圖; 圖9為本發(fā)明與現(xiàn)有方法在相同數(shù)據(jù)時(shí)的速度比較圖。
具體實(shí)施例方式 本發(fā)明的核心思想是利用分塊策略對(duì)整體體數(shù)據(jù)劃分,動(dòng)態(tài)地載入到紋理內(nèi)存,并利用空間跳躍技術(shù)加速繪制過(guò)程。通過(guò)對(duì)整體體數(shù)據(jù)進(jìn)行劃分,生成多個(gè)大小相等的子塊,利用八叉樹結(jié)構(gòu)組織各個(gè)子塊內(nèi)的體數(shù)據(jù),計(jì)算子塊與平面的距離,按從后向前的順序載入到紋理內(nèi)存中,采用3D紋理體繪制算法對(duì)子塊內(nèi)的有效體數(shù)據(jù)進(jìn)行繪制,并混合每個(gè)子塊的繪制結(jié)果,獲得整體體數(shù)據(jù)的繪制圖像。
參照?qǐng)D1,本發(fā)明具體步驟如下 步驟1.對(duì)整體體數(shù)據(jù)分塊。
利用分塊策略對(duì)整體體數(shù)據(jù)進(jìn)行分解,得到多個(gè)大小相等的子塊。
整體體數(shù)據(jù)在內(nèi)存中按X、Y、Z方向的順序逐層存儲(chǔ),最終體數(shù)據(jù)在內(nèi)存中的排列方式與3D數(shù)組相同,如圖2所示。對(duì)整體體數(shù)據(jù)進(jìn)行分解后,生成多個(gè)子塊,體數(shù)據(jù)按子塊為單位進(jìn)行存儲(chǔ),如圖3所示。分解整體體數(shù)據(jù),當(dāng)子塊的大小小于紋理內(nèi)存的容量時(shí),停止對(duì)體數(shù)據(jù)分解。
GPU不支持跨越子塊邊界插值采樣,因此對(duì)體數(shù)據(jù)簡(jiǎn)單的空間劃分會(huì)導(dǎo)致相鄰子塊的邊界處采樣不連續(xù),嚴(yán)重地影響繪制質(zhì)量。圖4以1D紋理為例,說(shuō)明了該問(wèn)題。其中圖4(a)為原始的1D紋理示意圖,圖4(b)為對(duì)1D紋理不保留邊界劃分后的采樣示意圖,圖4(c)為對(duì)1D紋理保留邊界劃分后的采樣示意圖。圖4(b)中由于子塊沒(méi)有足夠的信息保持邊界處插值的連續(xù)性,因此在子塊邊界處會(huì)產(chǎn)生錯(cuò)誤的插值結(jié)果。為解決該問(wèn)題,需要在每個(gè)子塊邊界上保留一個(gè)邊界體素,相鄰的子塊擁有相同的邊界體素信息,GPU就可以得到正確的插值結(jié)果,如圖4(c)所示。
步驟2.對(duì)所有子塊排序。
載入子塊時(shí),需按與視平面的距離從后向前的順序。
其中,子塊與視平面距離 式中,
為視線方向,d0為視平面與原點(diǎn)的距離,d為空間一點(diǎn)p到平面的距離,當(dāng)d等于0時(shí),點(diǎn)p在平面上。把子塊的中心點(diǎn)坐標(biāo)帶入上式中求出子塊到視平面的距離,通常視點(diǎn)都在體數(shù)據(jù)之外,因此各子塊都在視平面的同側(cè)。對(duì)d取絕對(duì)值后對(duì)子塊從后向前排序,確定每個(gè)子塊載入與繪制的順序。
步驟3.利用八叉樹組織每個(gè)子塊。
與分塊規(guī)劃不同,利用八叉樹對(duì)子塊進(jìn)行剖分時(shí),不改變子塊內(nèi)體數(shù)據(jù)的存儲(chǔ)方式,僅根據(jù)空間位置信息統(tǒng)計(jì)對(duì)應(yīng)體數(shù)據(jù)的最大最小值、剖分深度。
(3a)構(gòu)建八叉樹 設(shè)置八叉樹的高度,從原始體數(shù)據(jù)開始,逐層對(duì)體數(shù)據(jù)剖分,對(duì)每次生成的八個(gè)子塊按空間位置進(jìn)行編號(hào),如圖5所示。其中圖5(a)為八叉樹分解體數(shù)據(jù)的示意圖,圖5(b)為八叉樹的結(jié)構(gòu)示意圖。子塊的最大最小值、剖分深度、空間位置信息保存在對(duì)應(yīng)的八叉樹結(jié)點(diǎn)中。八叉樹的數(shù)據(jù)結(jié)構(gòu)如下 Struct OctreeNode { unsigned int XCode,YCode,ZCode; //八叉樹結(jié)點(diǎn)的方向編碼 int MinValue,MaxValue;//八叉樹結(jié)點(diǎn)的最大最小值 OctreeNode* Children[8]; //八叉樹結(jié)點(diǎn)的子結(jié)點(diǎn) } 上述數(shù)據(jù)結(jié)構(gòu)中,MaxValue和MinValue存儲(chǔ)對(duì)應(yīng)子體數(shù)據(jù)內(nèi)所有體素的最大最小值,指針Children[i]指向當(dāng)前結(jié)點(diǎn)的第i個(gè)子結(jié)點(diǎn),方向編碼XCode、YCode和ZCode包含了子體數(shù)據(jù)的剖分深度及空間位置信息 icoord=(c1×2-1+c2×2-2+c3×2-3+...+cn×2-n)×IWidth iwidth=2-depth×IWidth=2-n×IWidth 其中,icoord表示子塊在原始體數(shù)據(jù)中某個(gè)坐標(biāo)軸方向的起始坐標(biāo),IWidth表示原始體數(shù)據(jù)的某個(gè)坐標(biāo)軸方向的寬度,iwidth表示子塊在某個(gè)坐標(biāo)軸方向的寬度,c1c2c3...cn為八叉樹結(jié)點(diǎn)沿某坐標(biāo)方向的方向編碼,depth為結(jié)點(diǎn)沿某坐標(biāo)方向的深度。
(3b)確定八叉樹的遍歷順序 為確保八叉樹結(jié)點(diǎn)對(duì)應(yīng)的體數(shù)據(jù)按從后向前的順序被繪制,計(jì)算八叉樹結(jié)點(diǎn)與視點(diǎn)的距離,根據(jù)距離確定遍歷順序。
(3c)跳躍對(duì)最終繪制結(jié)果無(wú)貢獻(xiàn)的無(wú)效體數(shù)據(jù) 遍歷到某結(jié)點(diǎn)時(shí),判斷結(jié)點(diǎn)內(nèi)體數(shù)據(jù)值的范圍A和預(yù)先設(shè)定的有效體數(shù)據(jù)顯示范圍B之間的關(guān)系,其中A為最大最小值之間的范圍。
當(dāng)
時(shí),說(shuō)明該結(jié)點(diǎn)對(duì)應(yīng)體數(shù)據(jù)都不在顯示范圍內(nèi); 當(dāng)
且時(shí),說(shuō)明該結(jié)點(diǎn)對(duì)應(yīng)體數(shù)據(jù)中有部分體素在顯示范圍,如果該結(jié)點(diǎn)不是葉子結(jié)點(diǎn),遍歷它的子結(jié)點(diǎn); 當(dāng)時(shí),說(shuō)明該結(jié)點(diǎn)對(duì)應(yīng)體數(shù)據(jù)全部在顯示范圍內(nèi)。
步驟4.依次載入子塊。
載入子塊時(shí),與混合采樣多邊形的順序相同,按從后向前的順序載入。在載入新子塊時(shí),采用紋理替換,直接用該子塊內(nèi)的體數(shù)據(jù)替換當(dāng)前紋理中的數(shù)據(jù),以避免頻繁的紋理刪除和創(chuàng)建帶來(lái)的開銷。
步驟5.繪制載入到紋理內(nèi)存中的每個(gè)子塊。
本發(fā)明采用3D紋理映射體繪制算法對(duì)載入到紋理內(nèi)存中的每個(gè)子塊逐個(gè)繪制,其步驟如下 (5a)定義采樣平面 首先確定采樣步長(zhǎng),然后沿與視線垂直的方向,定義一系列平行且等距的采樣平面,其中平面間的距離為采樣步長(zhǎng),采樣平面方程為 式中,
為采樣平面的法向坐標(biāo),d為該采樣平面與原點(diǎn)的距離,ρs為采樣平面上點(diǎn)的坐標(biāo); (5b)計(jì)算采樣平面與有效子塊邊界的交點(diǎn) 等距的采樣平面和體數(shù)據(jù)邊界相交,每個(gè)采樣平面和體數(shù)據(jù)的邊界產(chǎn)生三到六個(gè)交點(diǎn)。采用八叉樹組織體數(shù)據(jù)后,所有有效子體數(shù)據(jù)的邊界都和采樣平面相交形成采樣多邊形。當(dāng)繪制子塊時(shí),如果逐個(gè)計(jì)算每個(gè)采樣平面與子塊邊界的交點(diǎn),計(jì)算量太大。當(dāng)子塊數(shù)量較多時(shí),空間跳躍所節(jié)省的時(shí)間都被增加的計(jì)算量消耗掉了。對(duì)此本發(fā)明采用了一種快速計(jì)算交點(diǎn)的方法計(jì)算采樣平面與邊界每條邊的第一個(gè)交點(diǎn),然后計(jì)算出每條邊上相鄰交點(diǎn)的距離向量,則同一條邊的后續(xù)交點(diǎn)坐標(biāo)可通過(guò)遞增求得。包圍盒的兩個(gè)頂點(diǎn)ρi和ρj之間邊上的點(diǎn)可以用下式表示 式中,m∈
,
為從頂點(diǎn)ρi到ρj的向量,該式代入到采樣平面方程中,可求出采樣平面與包圍盒邊界的交點(diǎn)。
表示相鄰交點(diǎn)間的向量,它和
同向,可以通過(guò)下式求出 式中,dslic是相鄰的兩個(gè)采樣平面間的距離。
計(jì)算出采樣平面和包圍盒邊界的第一個(gè)交點(diǎn)后,同一條邊上后續(xù)的交點(diǎn)坐標(biāo)就可以通過(guò)遞增
計(jì)算得到。交點(diǎn)計(jì)算完后,對(duì)它們進(jìn)行圖元裝配,生成采樣多邊形,并把采樣多邊形的頂點(diǎn)坐標(biāo)傳遞給GPU。
(5c)紋理映射 利用采樣多邊形在體數(shù)據(jù)中進(jìn)行紋理映射,并對(duì)映射后的紋理片元著色;體數(shù)據(jù)在紋理內(nèi)存中以3D紋理的形式存儲(chǔ);利用采樣多邊形在3D紋理中采樣后,得到采樣點(diǎn)的體數(shù)據(jù)值,并根據(jù)傳輸函數(shù)及設(shè)定的光照模型對(duì)采樣點(diǎn)處理,確定該點(diǎn)的最終顏色。
(5d)混合采樣多邊形 從后向前混合采樣多邊形,獲得該子塊的繪制結(jié)果圖像。3D紋理映射體繪制算法通常采用由后向前的混合方式。該混合方式可通過(guò)圖形處理平臺(tái)的基本命令指定。本發(fā)明選用OpenGL作為圖形處理平臺(tái),OpenGL指定由后向前混合方式的命令如下 glBlendFunc(GL_SRC,GL_ONE_MINUS_SRC_ALPHA)。
步驟6.混合所有子塊的繪制結(jié)果。
為正確得到最終繪制圖像,載入和繪制子塊及繪制子塊時(shí)采樣多邊形的混合都是按照從后向前的順序。在繪制第一個(gè)子塊后,繪制的結(jié)果保存在幀緩存中;載入下一個(gè)子塊并進(jìn)行切片采樣,新的采樣多邊形同樣按從后向前的順序與上個(gè)子塊繪制結(jié)果混合。因此,所有采樣多邊形都是按照從后向前的順序混合,與直接繪制整體數(shù)據(jù)時(shí)采樣多邊形的混合順序一致。
本發(fā)明的優(yōu)點(diǎn)可通過(guò)以下實(shí)驗(yàn)進(jìn)一步說(shuō)明 1.實(shí)驗(yàn)條件 本發(fā)明的實(shí)驗(yàn)是在計(jì)算機(jī)斷層掃描設(shè)備獲取的臨床醫(yī)學(xué)影像上進(jìn)行的。實(shí)驗(yàn)平臺(tái)為CPU為Pentium D 2.8GHz、內(nèi)存為1.0GB的DDR2型、GPU為NVIDIA GeForce9600GT,顯存大小為256MB。實(shí)驗(yàn)數(shù)據(jù)共有4個(gè),如表1所示。
表1. 實(shí)驗(yàn)體數(shù)據(jù) 為了測(cè)試本發(fā)明的合理性與有效性,設(shè)計(jì)了三組測(cè)試實(shí)驗(yàn)室(1)該發(fā)明對(duì)體數(shù)據(jù)繪制的結(jié)果圖像與直接體繪制方法的一致性實(shí)驗(yàn);(2)該發(fā)明在不同八叉樹深度時(shí)加速效果的有效性實(shí)驗(yàn);(3)本發(fā)明與同類方法的性能對(duì)比實(shí)驗(yàn)。實(shí)驗(yàn)中,繪制結(jié)果在相同窗口大小,旋轉(zhuǎn)角度、放縮比例及采樣率下獲得。另外,進(jìn)行結(jié)果圖像一致性實(shí)驗(yàn)時(shí),采用的頭部數(shù)據(jù)規(guī)模小于GPU的紋理內(nèi)存。
2.實(shí)驗(yàn)結(jié)果 (1)一致性實(shí)驗(yàn) 通過(guò)對(duì)數(shù)據(jù)規(guī)模小于紋理內(nèi)存的頭部體數(shù)據(jù)分別進(jìn)行分塊動(dòng)態(tài)繪制和直接繪制,比較繪制結(jié)果來(lái)驗(yàn)證兩種方法的一致性,實(shí)驗(yàn)結(jié)果如圖6。其中,圖6(a)為對(duì)整體體數(shù)據(jù)直接繪制的圖像,圖6(b)為在圖6(a)的基礎(chǔ)上添加包圍盒邊框的繪制圖像,圖6(c)為對(duì)整體體數(shù)據(jù)分塊后繪制的圖像,圖6(d)為在圖6(c)的基礎(chǔ)上添加包圍盒邊框的繪制圖像,圖6(e)為對(duì)整體體數(shù)據(jù)分塊及對(duì)利用八叉樹組織子塊后繪制的圖像,圖6(f)為在圖6(e)的基礎(chǔ)上添加包圍盒邊框的繪制圖像。
計(jì)算圖6(a)、圖6(c)和圖6(e)中任意兩幅圖像之間的均方誤差 其中M、N分別為圖像的寬和高,f1(x,y)和f2(x,y)為兩幅圖像在點(diǎn)(x,y)處的顏色值。
經(jīng)過(guò)計(jì)算,圖6(a)、圖6(c)、圖6(e)中任意兩幅圖像間的均方誤差都為0,說(shuō)明了本發(fā)明提出的分塊動(dòng)態(tài)繪制方法和對(duì)體數(shù)據(jù)直接繪制方法獲得的圖像完全一致,而利用八叉樹排除對(duì)最終繪制圖像無(wú)貢獻(xiàn)的無(wú)效體數(shù)據(jù)后,對(duì)繪制圖像沒(méi)有影響。為避免不必要的誤差,計(jì)算均方誤差時(shí)圖像直接從幀緩存中讀取。
(2)有效性實(shí)驗(yàn) 對(duì)表1中的體數(shù)據(jù)進(jìn)行實(shí)驗(yàn),繪制圖像及速度如圖7及表2和3所示,其中圖7(a)為人體全身數(shù)據(jù)的繪制示意圖,圖7(b)為人體胸腔數(shù)據(jù)的繪制示意圖,圖7(c)為人體動(dòng)脈瘤數(shù)據(jù)的繪制示意圖。
表2 不同剖分深度時(shí)分塊動(dòng)態(tài)繪制的速度
表3 不同剖分深度時(shí)跳過(guò)無(wú)效體數(shù)據(jù)數(shù)量占體素總數(shù)量的百分比
表2中分別為分塊動(dòng)態(tài)繪制及分塊動(dòng)態(tài)繪制加空間跳躍加速的繪制速度,其中整體體數(shù)據(jù)分為了8個(gè)子塊,子塊內(nèi)構(gòu)建八叉樹的深度分別為2、3、4、5、6。由表2可以看出,不同的八叉樹剖分深度對(duì)繪制速度的影響不同。在八叉樹剖分深度較小時(shí),生成的有效體數(shù)據(jù)包圍盒的體積較大,繪制速度并沒(méi)有明顯提高;隨著剖分深度逐漸增加,繪制速度逐漸加快;當(dāng)達(dá)到某一剖分深度時(shí),繪制速度達(dá)到最快;但當(dāng)體數(shù)據(jù)進(jìn)一步被剖分時(shí),速度開始明顯下降。通過(guò)在不同剖分深度繪制時(shí)對(duì)排除的空體數(shù)據(jù)數(shù)量的統(tǒng)計(jì),如表3所示,發(fā)現(xiàn)當(dāng)包圍盒體積較大時(shí),包圍盒中體數(shù)據(jù)值范圍較大,排除的空體數(shù)據(jù)的數(shù)量較少,因此加速不明顯。而隨著剖分深度的逐漸增加,包圍盒體積逐漸變小,包圍盒內(nèi)體數(shù)據(jù)值范圍也逐漸縮小,排除的空體數(shù)據(jù)的數(shù)量大幅度增加,因此速度增加較快。當(dāng)剖分深度達(dá)到最佳后,對(duì)體數(shù)據(jù)進(jìn)一步剖分時(shí),排除的空體數(shù)據(jù)的數(shù)量逐漸趨近極限,增長(zhǎng)幅度越來(lái)越小,而生成的子塊包圍盒的數(shù)量卻以23n增長(zhǎng),其中n為剖分深度,因此極大地增加了求采樣平面與子塊包圍盒交點(diǎn)坐標(biāo)的計(jì)算量,導(dǎo)致了速度的下降。
(3)對(duì)比性實(shí)驗(yàn) DBR代表發(fā)明提出的算法,VT代表現(xiàn)有的可視檢測(cè)算法。
圖8為本發(fā)明與可視檢測(cè)方法的速度比較結(jié)果,縱軸坐標(biāo)的單位為幀/s。
圖9為本發(fā)明與可視檢測(cè)方法跳過(guò)的無(wú)效體數(shù)據(jù)占所有體數(shù)據(jù)的百分比。
通過(guò)圖8和9可以看出,雖然可視檢測(cè)方法采用了光線提前終止、傳輸函數(shù)挑選、可視剔除等多種檢測(cè)手段,跳過(guò)的無(wú)效體數(shù)據(jù)數(shù)量多于分塊動(dòng)態(tài)繪制方法,但繪制速度卻較慢。經(jīng)過(guò)分析可視檢測(cè)方法生成子塊數(shù)量較多,以全身數(shù)據(jù)為例,子塊數(shù)據(jù)規(guī)模為64×64×64,子塊數(shù)量為1600個(gè),經(jīng)過(guò)檢測(cè)后,圖形流水線仍需要載入700多個(gè)有效子塊,因此GPU在繪制一幀圖像時(shí)等待載入和切換紋理700多次,GPU用于等待載入和紋理切換的開銷太高。本發(fā)明提出的分塊動(dòng)態(tài)繪制方法只生成8個(gè)子塊,依次載入紋理內(nèi)存,并通過(guò)遮擋測(cè)試,避免了對(duì)完全被遮擋子塊的繪制,在繪制子塊時(shí),最多只需切換紋理8次,而且經(jīng)過(guò)空間跳躍減少了GPU的處理時(shí)間,同時(shí)并未增加紋理切換的開銷,有效地提高了繪制速度。
上述實(shí)驗(yàn)結(jié)果中,確定八叉樹結(jié)點(diǎn)的遍歷順序時(shí),在無(wú)旋轉(zhuǎn)的情況下,只需對(duì)各個(gè)結(jié)點(diǎn)與視平面的距離進(jìn)行一次計(jì)算。與已有的分塊方法相比,本發(fā)明提出的方法不降低圖像質(zhì)量,繪制速度更快。
權(quán)利要求
1.一種基于分塊策略的大規(guī)模數(shù)據(jù)場(chǎng)體繪制方法,包括如下過(guò)程
A.對(duì)計(jì)算機(jī)內(nèi)存中待處理的整體體數(shù)據(jù)進(jìn)行分塊規(guī)劃,生成大小相等的多個(gè)子塊,并對(duì)生成的每個(gè)子塊編號(hào);
B.在視口坐標(biāo)系下,計(jì)算生成的每個(gè)子塊與視平面之間的距離,并根據(jù)該距離,按從后向前對(duì)子塊進(jìn)行排序;
C.利用八叉樹結(jié)構(gòu)組織子塊內(nèi)的體數(shù)據(jù),并通過(guò)遍歷八叉樹排除對(duì)最終繪制結(jié)果無(wú)貢獻(xiàn)的無(wú)效體數(shù)據(jù);
D.對(duì)利用八叉樹結(jié)構(gòu)組織后的子塊,依次作為3D紋理載入到紋理內(nèi)存中;
E.對(duì)紋理內(nèi)存中的每個(gè)子塊,利用3D紋理體繪制算法逐個(gè)進(jìn)行繪制,得到所有子塊的繪制結(jié)果;
F.對(duì)每個(gè)子塊的繪制結(jié)果,在幀緩存中按從后向前的順序混合,得到整體體數(shù)據(jù)的繪制圖像。
2.根據(jù)權(quán)利要求1所述的大規(guī)模數(shù)據(jù)場(chǎng)體數(shù)據(jù)方法,其中步驟C所述的利用八叉樹結(jié)構(gòu)組織子塊內(nèi)的體數(shù)據(jù),按如下步驟進(jìn)行
2a.設(shè)置八叉樹的剖分深度,根據(jù)空間位置對(duì)體數(shù)據(jù)逐層剖分;
2b.對(duì)剖分生成的子體數(shù)據(jù)的最大最小值、剖分深度及空間位置等信息,利用八叉樹結(jié)構(gòu)保存,該八叉樹數(shù)據(jù)結(jié)構(gòu)如下
Struct OctreeNode
{
unsigned int XCode,YCode,ZCode;//八叉樹結(jié)點(diǎn)的方向編碼
intMin Value,MaxValue;//八叉樹結(jié)點(diǎn)的最大最小值
OctreeNode*Children[8];//八叉樹結(jié)點(diǎn)的子結(jié)點(diǎn)
}
上述數(shù)據(jù)結(jié)構(gòu)中,MaxValue和MinValue存儲(chǔ)當(dāng)前八叉樹結(jié)點(diǎn)對(duì)應(yīng)子體數(shù)據(jù)的最大最小值,指針Children[i]指向當(dāng)前結(jié)點(diǎn)的第i個(gè)子結(jié)點(diǎn),方向編碼XCode、YCode和ZCode包含了子體數(shù)據(jù)的剖分深度及空間位置信息
icoord=(c1×2-1+c2×2-2+c3×2-3+...+cn×2-n)×IWidth
iwidth=2-depth×IWidth=2-n×IWidth
式中,icoord表示子體數(shù)據(jù)在原始體數(shù)據(jù)中在某個(gè)坐標(biāo)軸方向上的起始坐標(biāo),IWidth表示原始體數(shù)據(jù)在某個(gè)坐標(biāo)軸方向上的寬度,iwidth表示子數(shù)據(jù)在某個(gè)坐標(biāo)軸方向上的寬度,c1c2c3...cn為八叉樹結(jié)點(diǎn)沿某坐標(biāo)方向的方向編碼,depth為結(jié)點(diǎn)沿某坐標(biāo)方向的剖分深度。
3.根據(jù)權(quán)利要求1所述的大規(guī)模數(shù)據(jù)場(chǎng)體數(shù)據(jù)方法,其中步驟D所述對(duì)排序后的子塊,依次作為3D紋理載入到紋理內(nèi)存,是在載入新子塊時(shí),采用紋理替換,直接用該子塊內(nèi)的體數(shù)據(jù)替換當(dāng)前紋理中的數(shù)據(jù),以避免頻繁的紋理刪除和創(chuàng)建帶來(lái)的開銷。
4.根據(jù)權(quán)利要求1所述的大規(guī)模數(shù)據(jù)場(chǎng)體繪制方法,其中步驟E所述的利用3D紋理體繪制算法進(jìn)行繪制,按如下步驟進(jìn)行
4a.采樣多邊形與數(shù)據(jù)場(chǎng)中有效子體數(shù)據(jù)的邊界相交,先根據(jù)式(1)和式(2)計(jì)算出采樣多邊形與子體數(shù)據(jù)邊界的第一個(gè)交點(diǎn);再根據(jù)式(3)計(jì)算相鄰交點(diǎn)的增量;后續(xù)交點(diǎn)通過(guò)遞增求得,計(jì)算公式如下
式(2)和(1)中,
為采樣平面的法向坐標(biāo),d為該平面與原點(diǎn)的距離,ρs為交點(diǎn)坐標(biāo),ρm為包圍盒的兩個(gè)頂點(diǎn)ρi和ρj之間邊上的點(diǎn),
為從頂點(diǎn)ρi到ρj的向量,
將式(2)代入到式(1)中,求出采樣多邊形與子體數(shù)據(jù)邊界的第一個(gè)交點(diǎn),式(3)中
表示相鄰交點(diǎn)間的向量,它和
同向,dslic是相鄰的兩個(gè)采樣平面間的距離,根據(jù)式(3)求出相鄰交點(diǎn)的增量;
4b.根據(jù)計(jì)算出的所有交點(diǎn)坐標(biāo),采樣多邊形在3D紋理中進(jìn)行紋理映射;
4c.對(duì)紋理映射后的采樣多邊形,按照從后向前的順序進(jìn)行混合,得到當(dāng)前子塊的繪制結(jié)果;
4d.對(duì)依次載入到紋理內(nèi)存的每個(gè)子塊,重復(fù)上述4a-4b的操作,得到每個(gè)子塊的繪制結(jié)果。
全文摘要
本發(fā)明公開了一種基于分塊策略的大規(guī)模數(shù)據(jù)場(chǎng)體繪制方法,主要解決現(xiàn)有基于GPU的體繪制方法存在的存儲(chǔ)容量小的問(wèn)題。其繪制過(guò)程是分解整體體數(shù)據(jù),生成多個(gè)大小相等的子塊,并對(duì)生成的所有子塊編號(hào);計(jì)算每個(gè)子塊與視平面的距離,并根據(jù)距離對(duì)子塊按從后向前的順序排序;采用八叉樹結(jié)構(gòu)組織子塊,并利用八叉樹排除無(wú)效子塊中的體數(shù)據(jù);根據(jù)順序依次載入子塊到紋理內(nèi)存中;利用基于GPU的3D紋理體繪制算法逐個(gè)繪制子塊,得到每個(gè)子塊的繪制結(jié)果;在幀緩存中按從后向前的順序混合所有子塊的繪制結(jié)果,得到整體繪制圖像。本發(fā)明具有載入體數(shù)據(jù)到紋理內(nèi)存開銷低、處理和繪制體數(shù)據(jù)速度快的優(yōu)點(diǎn),可用于數(shù)據(jù)規(guī)模大于GPU紋理內(nèi)存容量體數(shù)據(jù)的快速繪制。
文檔編號(hào)G06T15/00GK101604453SQ20091002325
公開日2009年12月16日 申請(qǐng)日期2009年7月8日 優(yōu)先權(quán)日2009年7月8日
發(fā)明者高新波, 華 鄒, 呂新榮, 梁承志, 林 查, 王向華, 曹艷艷, 李晉舟, 寧文博, 王秀美 申請(qǐng)人:西安電子科技大學(xué)