欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種基于gpu的三維幾何圖元拾取方法

文檔序號(hào):6512674閱讀:340來(lái)源:國(guó)知局
一種基于gpu的三維幾何圖元拾取方法
【專利摘要】一種基于GPU的三維幾何圖元拾取方法,意在解決現(xiàn)有技術(shù)中拾取效率低、拾取對(duì)象有限、拾取信息量小等各種不足。在進(jìn)行拾取繪制時(shí)關(guān)閉光柵化,將鼠標(biāo)位置信息和圖元頂點(diǎn)坐標(biāo)變換到規(guī)范化設(shè)備坐標(biāo)系或視口坐標(biāo)系,通過(guò)在幾何處理器中判斷投影后的二維圖元與鼠標(biāo)位置或選擇框的關(guān)系進(jìn)行命中判定,并利用變換反饋將拾取結(jié)果返回應(yīng)用程序。本發(fā)明既適用于單體拾取,也適用于塊拾取,拾取繪制時(shí)無(wú)需進(jìn)行光柵化和片元處理,拾取過(guò)程高效快捷,可以獲取到豐富的拾取信息,能夠滿足包含大量幾何圖元的圖形應(yīng)用中的實(shí)時(shí)交互需求,可應(yīng)用到各種交互式圖形應(yīng)用中,例如CAD系統(tǒng)、游戲、UI、虛擬現(xiàn)實(shí)應(yīng)用等。
【專利說(shuō)明】—種基于GPU的三維幾何圖元拾取方法
[0001]【【技術(shù)領(lǐng)域】】
本發(fā)明涉及一種三維幾何圖元的快速選擇與拾取方法,特別涉及一種基于圖形處理單元GPU的三維幾何圖元拾取方法。
[0002]【【背景技術(shù)】】
圖形拾取是指,根據(jù)用戶使用鼠標(biāo)等定位設(shè)備進(jìn)行點(diǎn)擊操作的位置或者進(jìn)行框選操作的區(qū)域信息,返回選中的幾何圖元的ID等相關(guān)信息的過(guò)程。根據(jù)圖形拾取的結(jié)果,方可進(jìn)行進(jìn)一步的交互操作,因此該技術(shù)是交互式圖形應(yīng)用的關(guān)鍵技術(shù)之一,在CAD軟件、游戲、圖形用戶界面等方面有著廣泛應(yīng)用。
[0003]圖形拾取方式分為單體拾取和塊拾取兩種。單體拾取使用鼠標(biāo)點(diǎn)擊選取單個(gè)圖形對(duì)象;而塊拾取使用鼠標(biāo)鍵按下后拖動(dòng)形成的矩形框選取位于矩形框內(nèi)部的一個(gè)或多個(gè)圖形對(duì)象。
[0004]現(xiàn)有的三維幾何圖元拾取方法主要有以下三種:
1、老版本OpenGL中提供的拾取方法
基于固定流水線的老版本OpenGL提供了一種基于名稱堆棧和拾取矩陣的拾取方法。其主要步驟為:設(shè)置名稱緩存,進(jìn)入選擇模式,初始化名稱堆棧,設(shè)置拾取矩陣,進(jìn)行拾取繪制,返回常規(guī)模式,處理命中記錄。拾取的原理是利用拾取矩陣修改投影變換,將視域體限制在以鼠標(biāo)位置為中心的拾取塊內(nèi),繪制時(shí),如果圖形對(duì)象未被完全裁減掉,則根據(jù)當(dāng)前名稱堆棧中的名稱信息在名稱緩存中記錄一次命中信息。該方法需要為不同的圖形對(duì)象設(shè)置不同的ID,并在繪制相應(yīng)對(duì)象前更新名稱堆棧(進(jìn)行名稱的壓入與彈出操作)。
[0005]該方法的缺點(diǎn)是:頻繁的名稱堆棧的壓入與彈出操作會(huì)嚴(yán)重影響拾取的效率?’另外對(duì)于場(chǎng)景中含有大量幾何圖元的情況,名稱堆棧容易產(chǎn)生溢出;此外,該方法僅能得到拾取到的圖形對(duì)象ID,但得不到命中該對(duì)象的具體位置信息(比如所命中的三角形的坐標(biāo))。
[0006]2、射線相交測(cè)試法
射線相交測(cè)試法將鼠標(biāo)選中的點(diǎn)從屏幕坐標(biāo)系逆變換到世界坐標(biāo)系得到投影點(diǎn),然后將從視點(diǎn)指向投影點(diǎn)的射線與場(chǎng)景中的各個(gè)幾何圖元在世界坐標(biāo)系下進(jìn)行相交測(cè)試,找出被選中的物體。
[0007]射線相交測(cè)試法的步驟如下:首先獲得屏幕上鼠標(biāo)點(diǎn)擊的點(diǎn),找到其對(duì)應(yīng)的投影窗口上的點(diǎn)/7 ;然后計(jì)算拾取射線,即一條從原點(diǎn)出發(fā)穿過(guò)點(diǎn)/7的射線;將射線乘以投影矩陣和觀察矩陣級(jí)聯(lián)后矩陣的轉(zhuǎn)置逆矩陣,變換到和模型相同的坐標(biāo)系中,即將射線和模型變換到同一坐標(biāo)系中;判定射線和物體是否相交,如果相交則該物體是被拾取到的物體,對(duì)于有多個(gè)物體與射線相交的情況,可根據(jù)深度信息判定拾取到的物體。
[0008]該方法能夠得到更精確的拾取信息,但不適用于塊拾取。進(jìn)行塊拾取時(shí),拾取點(diǎn)有非常多個(gè),需要用多條射線進(jìn)行相交測(cè)試,計(jì)算量太大。
[0009]3、基于離屏渲染的拾取方法
此方法是將圖形對(duì)象ID等信息編碼為顏色,在進(jìn)行拾取時(shí)進(jìn)行一次額外的繪制,將不同對(duì)象以不同的顏色繪制到離屏緩存中,繪制完成后根據(jù)鼠標(biāo)位置讀取離屏緩存中相應(yīng)位置像素的顏色值,進(jìn)行解碼從而獲得拾取到的物體信息。
[0010]該方法的步驟如下:首先進(jìn)行初始化,創(chuàng)建離屏緩存對(duì)象FBO以及對(duì)圖形對(duì)象ID等信息進(jìn)行顏色編碼;然后在拾取時(shí)進(jìn)行一次額外的繪制,繪制時(shí)使用與正常模式一樣的變換,保證渲染得到的圖像中物體位置與正常模式下一致,但繪制時(shí)每個(gè)對(duì)象使用不同的單一顏色;繪制結(jié)束后,從離屏緩存中讀取與鼠標(biāo)位置對(duì)應(yīng)的像素的顏色,對(duì)其解碼從而獲得物體的ID等信息。 [0011]此方法有以下缺點(diǎn):需要進(jìn)行一次額外的繪制,須耗費(fèi)一定時(shí)間;再者對(duì)象信息編碼容量受到離屏緩存位深的限制;此外相對(duì)于前兩種方法,該方法能夠獲取到的拾取對(duì)象信息非常有限,例如只能拾取到位于最前方的對(duì)象,而獲取不到位于拾取位置后方被遮擋的對(duì)象。
[0012]隨著現(xiàn)代GPU的迅速發(fā)展,GPU的并行處理能力以超摩爾定律的速度發(fā)展著,在并行處理方面較CPU有著絕對(duì)優(yōu)勢(shì),同時(shí)GPU的可編程能力越來(lái)越強(qiáng),靈活性越來(lái)越高。Shader Model 4.0 的 GPU 上已經(jīng)可以進(jìn)行 Vertex Shader> Geometry Shader 和 FragmentShader三個(gè)階段的GPU編程;Shader Model 5.0中更是增加了曲面細(xì)分Shader以及用于GPU通用計(jì)算的Compute Shader等。Shader是自定義的在GPU上運(yùn)行的小程序,用于替代固定渲染管線中的部分流程??删幊棠芰Φ脑鰪?qiáng)使得可以實(shí)現(xiàn)更多的圖形特效,同時(shí)也能利用GPU進(jìn)行更廣泛的通用計(jì)算。
[0013]【
【發(fā)明內(nèi)容】

本發(fā)明針對(duì)現(xiàn)有技術(shù)中拾取效率低、拾取對(duì)象有限、拾取信息量小等各種不足,通過(guò)將GI^U用于通用計(jì)算目的而非渲染目的,充分利用現(xiàn)代GPU的并行處理能力、可編程性及靈活性,提供一種可在大量幾何圖元中快速拾取目標(biāo)圖元或圖元集合,并能獲取豐富拾取信息的拾取方法。
[0014]該方法的基本思想是,將鼠標(biāo)位置信息和圖元頂點(diǎn)坐標(biāo)變換到規(guī)范化設(shè)備坐標(biāo)系或視口坐標(biāo)系,利用幾何處理器(Geometry Shader)判斷投影后的二維圖元與鼠標(biāo)位置或選擇框的關(guān)系,并利用變換反饋(Transform Feedback)將拾取結(jié)果返回應(yīng)用程序。
[0015]本發(fā)明的技術(shù)方案是:
一種基于GPU的三維幾何圖元單體拾取方法,其特征在于,包括如下步驟:
(1)將鼠標(biāo)位置由窗口設(shè)備坐標(biāo)系轉(zhuǎn)換到規(guī)范化設(shè)備坐標(biāo)系(當(dāng)拾取三角形時(shí))或視口坐標(biāo)系(當(dāng)拾取線段或點(diǎn)時(shí))下,并將其傳入幾何處理器;
(2)關(guān)閉光柵化,使得進(jìn)行拾取繪制時(shí)圖元僅流經(jīng)頂點(diǎn)處理器和幾何處理器;
(3)開(kāi)啟變換反饋,繪制各拾取對(duì)象,利用幾何處理器判斷當(dāng)前圖元是否會(huì)覆蓋到鼠標(biāo)位置,如果會(huì)覆蓋到則利用變換反饋將圖元信息輸出到回饋緩存中,如果不會(huì)覆蓋到則遺棄當(dāng)前圖元;應(yīng)用程序端負(fù)責(zé)場(chǎng)景的組織、繪制順序的控制,以及為頂點(diǎn)處理器和幾何處理器提供拾取需要的屬性參數(shù)。
[0016](4)關(guān)閉變換反饋,查詢反饋結(jié)果,處理和獲取拾取信息。
[0017]所述的基于GPU的三維幾何圖元單體拾取方法,其特征在于,所述步驟⑶中,繪制各拾取對(duì)象時(shí)GPU端頂點(diǎn)處理器主要對(duì)輸入頂點(diǎn)進(jìn)行坐標(biāo)變換,變換到裁剪坐標(biāo)系下,如果需要獲取拾取到的圖元的其他坐標(biāo)系下坐標(biāo),則在頂點(diǎn)處理器中進(jìn)行計(jì)算并傳給幾何處理器。[0018]所述的基于GPU的三維幾何圖元單體拾取方法,其特征在于,繪制各拾取對(duì)象時(shí)GPU端幾何處理器要進(jìn)行以下處理:
(1)定義輸入輸出圖元類型,輸入圖元可能為三角形、線段或點(diǎn),每個(gè)命中圖元只產(chǎn)生一套屬性輸出,即輸出圖元類型設(shè)為點(diǎn);
(2)根據(jù)需要定義輸出到回饋緩存的屬性(例如圖元所屬對(duì)象的ID、父對(duì)象ID、鼠標(biāo)位置深度、圖元頂點(diǎn)世界坐標(biāo)等等);
(3)將輸入的裁剪坐標(biāo)系下的圖元頂點(diǎn)坐標(biāo)通過(guò)透視相除轉(zhuǎn)換到規(guī)范化設(shè)備坐標(biāo)系下,如果輸入圖元是線段或點(diǎn),則進(jìn)一步轉(zhuǎn)換到視口坐標(biāo)系下;
(4)通過(guò)取圖元頂點(diǎn)的前兩維坐標(biāo),得到規(guī)范化設(shè)備坐標(biāo)系下投影平面上的二維圖元坐標(biāo),然后判斷鼠標(biāo)位置是否在該二維圖元內(nèi)部;
(5)如果鼠標(biāo)位置在圖元內(nèi)部,則設(shè)置并輸出拾取信息到回饋緩存,其中拾取點(diǎn)的深度信息通過(guò)對(duì)圖元頂點(diǎn)的深度進(jìn)行線性插值得到;如果鼠標(biāo)位置在圖元外部,則遺棄當(dāng)前圖兀,不做輸出。
[0019]所述的基于GPU的三維幾何圖元單體拾取方法,其特征在于,在所述繪制各拾取對(duì)象時(shí)GPU端幾何處理器進(jìn)行處理的步驟(4)中,判斷鼠標(biāo)位置是否在二維圖元內(nèi)部的方法是:
1)如果輸入圖元是三角形,則沿逆時(shí)針繞向訪問(wèn)圖元各頂點(diǎn),如果拾取點(diǎn)始終在各邊的左邊,則其在三角形內(nèi)部,否則即在外部,可根據(jù)邊向量與從頂點(diǎn)指向拾取點(diǎn)向量叉乘結(jié)果的z坐標(biāo)符號(hào)判定拾取點(diǎn)是否在邊的左邊;
2)如果輸入圖元是線段,如果拾取點(diǎn)到線段的距離小于等于線寬的一半,且以線段為底邊、拾取點(diǎn)為頂部點(diǎn)的三角形的兩個(gè)底角都不是鈍角,則拾取點(diǎn)在線段上,否則在線段外;
3)如果輸入圖元是點(diǎn),根據(jù)拾取點(diǎn)到圖元的距離與點(diǎn)尺寸的關(guān)系決定拾取點(diǎn)是否在圖元內(nèi)部。
[0020]一種基于GPU的三維幾何圖元塊拾取方法,其步驟包括:
(1)將鼠標(biāo)選擇框坐標(biāo)由窗口設(shè)備坐標(biāo)系轉(zhuǎn)換到規(guī)范化設(shè)備坐標(biāo)系下,并將其傳入幾何處理器;
(2)關(guān)閉光柵化,使得進(jìn)行拾取繪制時(shí)圖元僅流經(jīng)頂點(diǎn)處理器和幾何處理器;
(3)開(kāi)啟變換反饋,繪制各拾取對(duì)象,利用幾何處理器判斷當(dāng)前圖元是否位于選擇框內(nèi)部,如果判斷結(jié)果為是,則利用變換反饋將圖元信息輸出到回饋緩存中,否則遺棄當(dāng)前圖元;應(yīng)用程序端負(fù)責(zé)場(chǎng)景的組織、繪制順序的控制,以及為頂點(diǎn)處理器和幾何處理器提供拾取需要的屬性參數(shù)。
[0021](4)關(guān)閉變換反饋,查詢反饋結(jié)果,處理和獲取拾取信息。
[0022]所述的基于GPU的三維幾何圖元塊拾取方法,其特征在于,在所述步驟(3)中,繪制各拾取對(duì)象時(shí)GPU端頂點(diǎn)處理器要對(duì)輸入頂點(diǎn)進(jìn)行坐標(biāo)變換,變換到裁剪坐標(biāo)系下,如果需要獲取拾取到的圖元的其他坐標(biāo)系下坐標(biāo),則在頂點(diǎn)處理器中進(jìn)行計(jì)算并傳給幾何處理器。
[0023]所述的基于GPU的三維幾何圖元塊拾取方法,其特征在于,繪制各拾取對(duì)象時(shí)GPU端幾何處理器要進(jìn)行以下處理:(1)定義輸入輸出圖元類型,輸入圖元可能為三角形、線段或點(diǎn),每個(gè)命中圖元只產(chǎn)生一套屬性輸出,即輸出圖元類型設(shè)為點(diǎn);
(2)根據(jù)需要定義輸出到回饋緩存的屬性(例如圖元所屬對(duì)象的ID、父對(duì)象ID、圖元頂點(diǎn)世界坐標(biāo)等等);
(3)將輸入的裁剪坐標(biāo)系下的圖元頂點(diǎn)坐標(biāo)通過(guò)透視相除轉(zhuǎn)換到規(guī)范化設(shè)備坐標(biāo)系
下;
(4)通過(guò)取圖元頂點(diǎn)的前兩維坐標(biāo),得到規(guī)范化設(shè)備坐標(biāo)系下投影平面上的二維圖元坐標(biāo),然后判斷圖元是否在鼠標(biāo)選擇框內(nèi)部;
(5)如果圖元在鼠標(biāo)選擇框內(nèi)部,則設(shè)置并輸出拾取信息到回饋緩存;如果鼠標(biāo)位置在圖元外部,則遺棄當(dāng)前圖元,不做輸出。
[0024]所述的基于GPU的三維幾何圖元塊拾取方法,其特征在于,在所述繪制各拾取對(duì)象時(shí)GPU端幾何處理器進(jìn)行處理的步驟(4)中,判斷圖元是否在鼠標(biāo)選擇框內(nèi)部的方法是:不考慮線寬和點(diǎn)尺寸的影響,當(dāng)圖元全部頂點(diǎn)位于選擇框內(nèi),即判定命中。
[0025]與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:
本發(fā)明借助幾何處理器在投影后的二維平面上進(jìn)行拾取的命中判定,并借助回饋緩存將拾取信息返回應(yīng)用程序,既適用于單體拾取,也適用于塊拾取。二維的命中判定較三維的射線相交測(cè)試計(jì)算量小,因此更高效快捷;進(jìn)行拾取繪制時(shí),無(wú)需進(jìn)行光柵化和片元處理,節(jié)省了處理時(shí)間;同時(shí)可以獲取到豐富的拾取信息,如對(duì)象ID、父對(duì)象ID、深度信息、圖元坐標(biāo)信息等等;整個(gè)拾取過(guò)程在GPU上完成,滿足了包含大量幾何圖元的圖形應(yīng)用中的實(shí)時(shí)交互需求。
[0026]【【專利附圖】

【附圖說(shuō)明】】
圖1為支持Shader Model 4.0的GPU的可編程圖形流水線示意圖;
圖2為本發(fā)明拾取繪制流程示意圖;
圖3為用于拾取繪制的幾何處理器程序流程;
圖4為判斷拾取點(diǎn)是否在三角形圖元內(nèi)部的示意圖;
圖5為判斷拾取點(diǎn)是否在線段圖元內(nèi)部的示意圖;
圖6為判斷拾取點(diǎn)是否在點(diǎn)圖元內(nèi)部的示意圖;
圖7為對(duì)三角形圖元內(nèi)部的拾取點(diǎn)進(jìn)行深度插值的示意圖。
[0027]【【具體實(shí)施方式】】
下面結(jié)合附圖和【具體實(shí)施方式】對(duì)本發(fā)明作進(jìn)一步詳細(xì)描述:
本發(fā)明技術(shù)方案的實(shí)施需要Shader Model 4.0及以上版本GPU的支持。
[0028]圖1為支持Shader Model 4.0的GPU的可編程圖形流水線示意圖,其中頂點(diǎn)處理器、幾何處理器和片元處理器為可編程的。頂點(diǎn)處理器處理的對(duì)象是頂點(diǎn),主要用于決定頂點(diǎn)位置等屬性;幾何處理器的處理對(duì)象是圖元,在此處理器中可獲取到頂點(diǎn)處理器傳遞過(guò)來(lái)的圖元各頂點(diǎn)信息,由于本發(fā)明對(duì)圖元進(jìn)行拾取需要圖元的完整信息,因此主要判定過(guò)程在此處理器中完成,變換反饋可將幾何處理器輸出的圖元頂點(diǎn)屬性輸出到反饋緩存中,從而將拾取信息返回給應(yīng)用程序;片元處理器的處理對(duì)象是片元,主要用于決定片元的顏色等屬性,由于片元數(shù)遠(yuǎn)大于頂點(diǎn)數(shù),其工作量通常遠(yuǎn)大于頂點(diǎn)處理,本發(fā)明在進(jìn)行拾取繪制時(shí)禁用了無(wú)需用到的光柵化及其后的片元處理等流水線階段,有助于提高效率。[0029]圖2為本發(fā)明拾取繪制流程示意圖。下面結(jié)合圖2對(duì)單體拾取的具體實(shí)施方案進(jìn)行說(shuō)明:
1、在拾取時(shí)禁用了光柵化(OpenGL 中通過(guò) glEnable(GL_ RASTERIZER_DISCARD)),因此在圖2中未出現(xiàn)光柵化、片元處理等流水線階段。
[0030]2、拾取對(duì)象的頂點(diǎn)數(shù)據(jù)存放在GPU端的頂點(diǎn)緩存中,以利于繪制時(shí)能高速訪問(wèn)。
[0031]3、繪制各拾取對(duì)象時(shí),應(yīng)用程序端進(jìn)行如下處理:
(1)場(chǎng)景的組織及繪制順序的控制:對(duì)于復(fù)雜場(chǎng)景,可按照深度順序繪制各拾取對(duì)象,以簡(jiǎn)化拾取信息的處理,并可利用場(chǎng)景分割和提前裁剪進(jìn)一步提高拾取繪制的效率;
(2)將鼠標(biāo)位置或鼠標(biāo)選擇框信息進(jìn)行坐標(biāo)轉(zhuǎn)換后傳入幾何處理器。當(dāng)進(jìn)行塊拾取、或者是進(jìn)行單體拾取且拾取圖元是三角形時(shí),將鼠標(biāo)位置由窗口設(shè)備坐標(biāo)系轉(zhuǎn)換到規(guī)范化設(shè)備坐標(biāo)系下,方法如下:
ptX = ((X - viewportX) / viewportffidth - 0.5) * 2;
ptY = ((viewportHeight -1 - y - viewportY) / viewportHeight - 0.5) * 2;其中ptX和ptY是轉(zhuǎn)換后的鼠標(biāo)位置,x和y是窗口設(shè)備坐標(biāo)系下的鼠標(biāo)位置,viewportX和viewportY是窗口坐標(biāo)系下視口左下角位置,viewportffidth和viewportHeight為視口的寬度和高度。而當(dāng)進(jìn)行單體拾取且拾取圖元是點(diǎn)或線段時(shí),則將鼠標(biāo)位置由窗口設(shè)備坐標(biāo)系轉(zhuǎn)換到視口坐標(biāo)系下,方法如下:ptX =χ- viewportX;
ptY = viewportHeig ht -1 - y - viewportY;
如果是進(jìn)行單體拾取且拾取圖元是線段或者點(diǎn),則還需將視口信息(將頂點(diǎn)坐標(biāo)變換到視口坐標(biāo)系下時(shí)需要)、線寬或點(diǎn)尺寸等拾取所需要的信息也傳進(jìn)幾何處理器;
(3)在繪制各拾取對(duì)象前,設(shè)置對(duì)象的變換矩陣并傳進(jìn)頂點(diǎn)處理器,這些變換矩陣與常規(guī)繪制時(shí)一致,以保證拾取繪制時(shí)各對(duì)象的位置不變;
(4)在繪制各拾取對(duì)象前,將各對(duì)象的ID傳進(jìn)幾何處理器,也可根據(jù)需要將其父對(duì)象ID等信息傳進(jìn)幾何處理器。
[0032]4、繪制各拾取對(duì)象時(shí)頂點(diǎn)處理器主要對(duì)輸入頂點(diǎn)進(jìn)行模型變換、觀察變換和投影變換,變換到裁剪坐標(biāo)系下。如果需要獲取拾取到的圖元的世界坐標(biāo)系或模型坐標(biāo)系下坐標(biāo),則在頂點(diǎn)處理器中計(jì)算相應(yīng)坐標(biāo)系下頂點(diǎn)坐標(biāo)并傳給幾何處理器。上述各種變換的矩陣與常規(guī)繪制時(shí)一致。
[0033]5、在進(jìn)行拾取繪制時(shí),幾何處理器的程序流程如圖3所示,具體闡述如下:
(I)輸入圖元類型根據(jù)實(shí)際情況可設(shè)置為三角形、線段或點(diǎn),絕大多數(shù)應(yīng)用中為三角形;每個(gè)命中圖元只產(chǎn)生一套拾取信息輸出,即輸出圖元類型是點(diǎn)。
[0034](2)輸入變量包括鼠標(biāo)位置或鼠標(biāo)選擇框信息,根據(jù)所需拾取信息設(shè)置的輸入變量(例如對(duì)象ID、父對(duì)象ID、世界坐標(biāo)系頂點(diǎn)坐標(biāo)等等),如果是進(jìn)行單體拾取且輸入圖元類型是線段或點(diǎn),則還包括視口信息及線段寬度或點(diǎn)的尺寸;輸出變量即輸出到回饋緩存的屬性,一般要有圖元所屬對(duì)象的ID,根據(jù)需要還可包括父對(duì)象ID、與鼠標(biāo)對(duì)象位置深度(進(jìn)行單體拾取時(shí))、拾取到圖元的頂點(diǎn)的世界坐標(biāo)等等。
[0035](3)通過(guò)透視相除即可將頂點(diǎn)坐標(biāo)從裁剪坐標(biāo)系轉(zhuǎn)換到規(guī)范化設(shè)備坐標(biāo)系(坐標(biāo)范圍在-1到I之間);如果是進(jìn)行單體拾取且輸入圖元類型是線段或點(diǎn),由于線寬和點(diǎn)尺寸是以像素為單位,命中判定最好在視口坐標(biāo)系下進(jìn)行,因此進(jìn)一步將頂點(diǎn)坐標(biāo)變換到視口坐標(biāo)系,方法如下:
P為頂點(diǎn)坐標(biāo)(三維向量),等式右邊的P為規(guī)范化設(shè)備坐標(biāo)系下頂點(diǎn)坐標(biāo),左邊的P為視口坐標(biāo)系下頂點(diǎn)坐標(biāo),viewportHalfSize為二維向量,保存有視口的寬度和高度的一半;僅對(duì)頂點(diǎn)坐標(biāo)前兩維進(jìn)行變換,因?yàn)檫M(jìn)行拾取的命中判定是二維的。
[0036](4)對(duì)投影平面上的二維圖元進(jìn)行命中判定是幾何處理器程序的核心。當(dāng)進(jìn)行單體拾取時(shí),目標(biāo)是判斷拾取點(diǎn)(鼠標(biāo)位置)是否位于當(dāng)前圖元內(nèi)部;當(dāng)進(jìn)行塊拾取時(shí),目標(biāo)是判斷當(dāng)前圖元是否位于鼠標(biāo)選擇框內(nèi)部。
[0037]判斷鼠標(biāo)位置是否在二維圖元內(nèi)部的方法是:
1)如果輸入圖元是三角形,則沿逆時(shí)針繞向訪問(wèn)圖元各頂點(diǎn),針對(duì)每一頂點(diǎn)計(jì)算從當(dāng)前頂點(diǎn)指向下一頂點(diǎn)的邊向量及從當(dāng)前頂點(diǎn)指向拾取點(diǎn)的向量,通過(guò)判斷此二向量的叉乘結(jié)果的z坐標(biāo)符號(hào)可知拾取點(diǎn)在邊的左邊(z >= O)還是右邊(z < O),如果拾取點(diǎn)在三條邊向量的左邊即可判定拾取點(diǎn)在三角形內(nèi)部,否則即在外部。圖4給出了判斷拾取點(diǎn)是否在三角形內(nèi)部的示意圖,對(duì)應(yīng)GLSL源碼如下:
/*判斷鼠標(biāo)位置是否在三角形內(nèi)*/
Il計(jì)算逆時(shí)針繞向的三條邊向量 vec3 AB = vec3 ((B - A).xy, 0); vec3 BC = vec3 ((C - B).xy, 0); vec3 CA = vec3((A - C).xy, 0);
Il計(jì)算從頂點(diǎn)指向拾取點(diǎn)的向量 vec3 AM = vec3(ptMouse - A.xy, 0); vec3 BM = vec3 (ptMouse - B.xy, 0); vec3 CM = vec3(ptMouse - C.xy, 0);
Il計(jì)算叉乘
vec3 CrossA = cross (AB, AM);
vec3 CrossB = cross (BC, BM);
vec3 CrossC = cross (CA, CM);
Il叉乘結(jié)果Z值均大于等于ο
2)如果輸入圖元是線段,需要考慮到線寬的存在,首先計(jì)算拾取點(diǎn)到線段的距離,如果距離小于等于線寬的一半,則進(jìn)一步考察以線段為底邊、拾取點(diǎn)為頂部點(diǎn)的三角形的兩個(gè)底角是否都不是鈍角,是則拾取點(diǎn)在線段上,上述條件有一個(gè)不滿足則在線段外。如圖5所示,拾取點(diǎn)M到線段AB的距離可以利用向量AM與歸一化的向量AB的叉乘結(jié)果得到,而兩底角是否為鈍角可通過(guò)其余弦值的符號(hào)判斷,余弦值可利用向量點(diǎn)積獲得。GLSL源碼如下:/*判斷鼠標(biāo)位置是否在線段上*/
//計(jì)算鼠標(biāo)位置到線段的距離
vec3 NormalizedAB = vec3(normalize ((B - A).xy), 0);
vec3 AM = vec3 (ptMouse - A.xy, 0);
float dist = abs(cross(AM, NormalizedAB).z);
if (dist <= halfLineffidth){
Il判斷以AB為底M為頂?shù)娜切蔚膬傻捉堑挠嘞抑凳欠癫恍∮贠
float cosBAM = dot (NormalizedAB.xy, AM.xy);
vec2 BM = ptMouse - B.xy;
float cosABM = dot(BM, -NormalizedAB.xy);
if(cosBAM >= 0 && cosABM >= 0){
//輸出拾取信息 }
3)如果輸入圖元是點(diǎn),如圖6所示,對(duì)于默認(rèn)的方形點(diǎn),根據(jù)拾取點(diǎn)到點(diǎn)圖元頂點(diǎn)的橫向和縱向距離與點(diǎn)尺寸的關(guān)系判定,對(duì)應(yīng)GLSL源碼:
/*判斷鼠標(biāo)位置是否在方形點(diǎn)上*/
//計(jì)算鼠標(biāo)位置到點(diǎn)的水平 和垂直距離 float distX = abs(ptMouse.x - A.x); float distY = abs(ptMouse.y - A.y); if (distX <= halfSize && distY <= halfSize){
//輸出拾取信息 }
而對(duì)于反走樣的圓形點(diǎn),直接根據(jù)拾取點(diǎn)到點(diǎn)圖元頂點(diǎn)的距離與點(diǎn)尺寸的關(guān)系判定,對(duì)應(yīng)GLSL源碼:
/*判斷鼠標(biāo)位置是否在圓形點(diǎn)上*/
//計(jì)算鼠標(biāo)位置到點(diǎn)的距離
float dist = distance(ptMouse, A.xy);
if (dist <= halfSize){
//輸出拾取信息 }
當(dāng)進(jìn)行塊拾取時(shí),圖元位于選擇框內(nèi)部有兩種情況:一種是圖元全部位于選擇框內(nèi)部;另一種是圖元有部分位于選擇框內(nèi)部。全部位于內(nèi)部時(shí)判定命中更適合拾取目標(biāo)是圖元的情況,而部分位于內(nèi)部時(shí)即判定命中更適合拾取目標(biāo)是圖元所屬對(duì)象的情況。本發(fā)明采用的是前者,這樣拾取更簡(jiǎn)單高效,由于圖元都是凸的,僅需判定圖元頂點(diǎn)是否都在選擇框內(nèi)即可,此判定不考慮線寬、點(diǎn)尺寸因素,全部在規(guī)范化設(shè)備坐標(biāo)系下完成。此種方法也可用于拾取圖元所屬對(duì)象,只是可能喪失一些精度。[0038](5)在為輸出屬性賦值時(shí),所屬對(duì)象ID及其父對(duì)象ID、圖元頂點(diǎn)世界坐標(biāo)等直接由輸入變量得到,而對(duì)于單體拾取,拾取點(diǎn)的深度屬性根據(jù)圖元頂點(diǎn)的深度線性插值得到:
1)對(duì)于三角形圖元,如圖7所示,拾取點(diǎn)M的深度可根據(jù)三個(gè)頂點(diǎn)A、B、C的深度值進(jìn)行線性插值得到,插值系數(shù)分別為三角形MBC、MCA、MAB的面積占三角形ABC面積的比重,三角形的面積可以利用叉乘得到,相應(yīng)的GLSL源碼如下:
Il計(jì)算深度插值并輸出 float AreaMBC = abs (CrossB.z); float AreaMCA = abs(CrossC.z); float AreaMAB = abs (CrossA.z); depth = dot (vec3 (A.z, B.z, C.z),
vec3(AreaMBC, AreaMCA, AreaMAB))
/ (AreaMBC + AreaMCA + AreaMAB);
其中CrossA、CrossB、CrossC的計(jì)算可參見(jiàn)前面圖4對(duì)應(yīng)的GLSL源碼;
2)對(duì)于線段圖元,由拾取點(diǎn)做關(guān)于線段的垂線,將拾取點(diǎn)的深度等同于垂足的深度,根據(jù)兩線段端點(diǎn)的深度線性插值得到;
3)對(duì)于點(diǎn)圖元,拾取點(diǎn)深度直接等同于點(diǎn)的深度。
[0039]6、在拾取繪制完成后,拾取結(jié)果已位于回饋緩存中,將其映射到應(yīng)用程序內(nèi)存中,即可處理和獲取到拾取信息。處理拾取信息時(shí),主要做的工作如下:
1)合并:將緩存中屬于同一個(gè)對(duì)象(ID相同)的圖元產(chǎn)生的命中記錄進(jìn)行合并,由于在繪制時(shí)是逐個(gè)對(duì)象繪制的,屬于相同對(duì)象的命中記錄在緩存中是連續(xù)的。如果拾取目標(biāo)是圖元,則無(wú)需進(jìn)行合并;
2)排序:根據(jù)深度從小到大順序?qū)Σ煌瑢?duì)象的記錄進(jìn)行排序。如果在繪制時(shí)已經(jīng)是按照深度順序進(jìn)行繪制的,則可不必進(jìn)行排序。
[0040]對(duì)于塊拾取,本發(fā)明的方案框架也可實(shí)現(xiàn)當(dāng)圖元有部分位于選擇框內(nèi)部時(shí)即判定命中,需要在判定時(shí)引入二維裁剪算法,復(fù)雜度有一定增加。
[0041]在進(jìn)行塊拾取且拾取目標(biāo)是三角形圖元時(shí),如果需要只拾取正面朝向屏幕的圖元,可在幾何處理器中加上正反面判定:通過(guò)三角形法線的z值符號(hào)判斷其朝向。
[0042]此外,三維幾何圖元的拾取方法也可用于拾取二維幾何圖元。
[0043]本發(fā)明中的拾取方法高效快捷、能獲取多種信息、靈活性強(qiáng),具有良好的應(yīng)用前景,可應(yīng)用到各種交互式圖形應(yīng)用中,例如CAD系統(tǒng)、游戲、U1、虛擬現(xiàn)實(shí)應(yīng)用等。本發(fā)明中的單體拾取方法適用面廣,而塊拾取方法尤其適合需要對(duì)拾取圖元進(jìn)行交互操作的幾何模型造型系統(tǒng)中。
【權(quán)利要求】
1.一種基于GPU的三維幾何圖元單體拾取方法,其特征在于,包括如下步驟: (1)將鼠標(biāo)位置由窗口設(shè)備坐標(biāo)系轉(zhuǎn)換到規(guī)范化設(shè)備坐標(biāo)系(當(dāng)拾取三角形時(shí))或視口坐標(biāo)系(當(dāng)拾取線段或點(diǎn)時(shí))下,并將其傳入幾何處理器; (2)關(guān)閉光柵化,使得進(jìn)行拾取繪制時(shí)圖元僅流經(jīng)頂點(diǎn)處理器和幾何處理器; (3)開(kāi)啟變換反饋,繪制各拾取對(duì)象,利用幾何處理器判斷當(dāng)前圖元是否會(huì)覆蓋到鼠標(biāo)位置,如果會(huì)覆蓋到則利用變換反饋將圖元信息輸出到回饋緩存中,如果不會(huì)覆蓋到則遺棄當(dāng)前圖元;應(yīng)用程序端負(fù)責(zé)場(chǎng)景的組織、繪制順序的控制,以及為頂點(diǎn)處理器和幾何處理器提供拾取需要的屬性參數(shù)。 (4)關(guān)閉變換反饋,查詢反饋結(jié)果,處理和獲取拾取信息。
2.如權(quán)利要求1所述的基于GPU的三維幾何圖元單體拾取方法,其特征在于,所述步驟(3)中,繪制各拾取對(duì)象時(shí)GPU端頂點(diǎn)處理器主要對(duì)輸入頂點(diǎn)進(jìn)行坐標(biāo)變換,變換到裁剪坐標(biāo)系下,如果需要獲取拾取到的圖元的其他坐標(biāo)系下坐標(biāo),則在頂點(diǎn)處理器中進(jìn)行計(jì)算并傳給幾何處理器。
3.如權(quán)利要求1或2所述的基于GPU的三維幾何圖元單體拾取方法,其特征在于,繪制各拾取對(duì)象時(shí)GPU端幾何處理器要進(jìn)行以下處理: (1)定義輸入輸出圖元類型,輸入圖元可能為三角形、線段或點(diǎn),每個(gè)命中圖元只產(chǎn)生一套屬性輸出,即輸出圖元類型設(shè)為點(diǎn); (2)根據(jù)需要定義輸出到回饋緩存的屬性(例如圖元所屬對(duì)象的ID、父對(duì)象ID、鼠標(biāo)位置深度、圖元頂點(diǎn)世界坐標(biāo)等等 ); (3)將輸入的裁剪坐標(biāo)系下的圖元頂點(diǎn)坐標(biāo)通過(guò)透視相除轉(zhuǎn)換到規(guī)范化設(shè)備坐標(biāo)系下,如果輸入圖元是線段或點(diǎn),則進(jìn)一步轉(zhuǎn)換到視口坐標(biāo)系下; (4)通過(guò)取圖元頂點(diǎn)的前兩維坐標(biāo),得到規(guī)范化設(shè)備坐標(biāo)系下投影平面上的二維圖元坐標(biāo),然后判斷鼠標(biāo)位置是否在該二維圖元內(nèi)部; (5)如果鼠標(biāo)位置在圖元內(nèi)部,則設(shè)置并輸出拾取信息到回饋緩存,其中拾取點(diǎn)的深度信息通過(guò)對(duì)圖元頂點(diǎn)的深度進(jìn)行線性插值得到;如果鼠標(biāo)位置在圖元外部,則遺棄當(dāng)前圖兀,不做輸出。
4.如權(quán)利要求3所述的基于GPU的三維幾何圖元單體拾取方法,其特征在于,在所述步驟(4)中,判斷鼠標(biāo)位置是否在二維圖元內(nèi)部的方法是: 1)如果輸入圖元是三角形,則沿逆時(shí)針繞向訪問(wèn)圖元各頂點(diǎn),如果拾取點(diǎn)始終在各邊的左邊,則其在三角形內(nèi)部,否則即在外部,可根據(jù)邊向量與從頂點(diǎn)指向拾取點(diǎn)向量叉乘結(jié)果的z坐標(biāo)符號(hào)判定拾取點(diǎn)是否在邊的左邊; 2)如果輸入圖元是線段,如果拾取點(diǎn)到線段的距離小于等于線寬的一半,且以線段為底邊、拾取點(diǎn)為頂部點(diǎn)的三角形的兩個(gè)底角都不是鈍角,則拾取點(diǎn)在線段上,否則在線段外; 3)如果輸入圖元是點(diǎn),根據(jù)拾取點(diǎn)到圖元的距離與點(diǎn)尺寸的關(guān)系決定拾取點(diǎn)是否在圖元內(nèi)部。
5.一種基于GPU的三維幾何圖元塊拾取方法,其步驟包括: (I)將鼠標(biāo)選擇框坐標(biāo)由窗口設(shè)備坐標(biāo)系轉(zhuǎn)換到規(guī)范化設(shè)備坐標(biāo)系下,并將其傳入幾何處理器;(2)關(guān)閉光柵化,使得進(jìn)行拾取繪制時(shí)圖元僅流經(jīng)頂點(diǎn)處理器和幾何處理器; (3)開(kāi)啟變換反饋,繪制各拾取對(duì)象,利用幾何處理器判斷當(dāng)前圖元是否位于選擇框內(nèi)部,如果判斷結(jié)果為是,則利用變換反饋將圖元信息輸出到回饋緩存中,否則遺棄當(dāng)前圖元;應(yīng)用程序端負(fù)責(zé)場(chǎng)景的組織、繪制順序的控制,以及為頂點(diǎn)處理器和幾何處理器提供拾取需要的屬性參數(shù)。 (4)關(guān)閉變換反饋,查詢反饋結(jié)果,處理和獲取拾取信息。
6.如權(quán)利要求5所述的基于GPU的三維幾何圖元塊拾取方法,其特征在于,在所述步驟(3)中,繪制各拾取對(duì)象時(shí)GPU端頂點(diǎn)處理器要對(duì)輸入頂點(diǎn)進(jìn)行坐標(biāo)變換,變換到裁剪坐標(biāo)系下,如果需要獲取拾取到的圖元的其他坐標(biāo)系下坐標(biāo),則在頂點(diǎn)處理器中進(jìn)行計(jì)算并傳給幾何處理器。
7.如權(quán)利要求5或6所述的基于GPU的三維幾何圖元塊拾取方法,其特征在于,繪制各拾取對(duì)象時(shí)GPU端幾何處理器要進(jìn)行以下處理: (1)定義輸入輸出圖元類型,輸入圖元可能為三角形、線段或點(diǎn),每個(gè)命中圖元只產(chǎn)生一套屬性輸出,即輸出圖元類型設(shè)為點(diǎn); (2)根據(jù)需要定義輸出到回饋緩存的屬性(例如圖元所屬對(duì)象的ID、父對(duì)象ID、圖元頂點(diǎn)世界坐標(biāo)等等); (3)將輸入的裁剪坐標(biāo)系下的圖元頂點(diǎn)坐標(biāo)通過(guò)透視相除轉(zhuǎn)換到規(guī)范化設(shè)備坐標(biāo)系下; (4)通過(guò)取圖元頂點(diǎn)的前兩.維坐標(biāo),得到規(guī)范化設(shè)備坐標(biāo)系下投影平面上的二維圖元坐標(biāo),然后判斷圖元是否在鼠標(biāo)選擇框內(nèi)部; (5)如果圖元在鼠標(biāo)選擇框內(nèi)部,則設(shè)置并輸出拾取信息到回饋緩存;如果鼠標(biāo)位置在圖元外部,則遺棄當(dāng)前圖元,不做輸出。
8.如權(quán)利要求7所述的基于GPU的三維幾何圖元塊拾取方法,其特征在于,在所述步驟(4)中,判斷圖元是否在鼠標(biāo)選擇框內(nèi)部的方法是:不考慮線寬和點(diǎn)尺寸的影響,當(dāng)圖元全部頂點(diǎn)位于選擇框內(nèi),即判定命中。
【文檔編號(hào)】G06T19/20GK103473814SQ201310436054
【公開(kāi)日】2013年12月25日 申請(qǐng)日期:2013年9月23日 優(yōu)先權(quán)日:2013年9月23日
【發(fā)明者】鄒昆, 周文輝, 黎敏, 楊亮, 黎冬媛, 李贊, 鄧春健, 段琢華 申請(qǐng)人:電子科技大學(xué)中山學(xué)院
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
万安县| 监利县| 法库县| 商都县| 裕民县| 台前县| 静安区| 泸溪县| 吉隆县| 清新县| 泰和县| 渭源县| 密云县| 阜康市| 商洛市| 贵港市| 土默特右旗| 司法| 博客| 廊坊市| 通山县| 斗六市| 马山县| 从化市| 晋州市| 黔西| 姚安县| 调兵山市| 绥芬河市| 桐庐县| 乐亭县| 甘肃省| 郑州市| 大港区| 顺平县| 榆社县| 瑞丽市| 通辽市| 迁安市| 都昌县| 板桥市|