TWI719379B - 光線追蹤方法與電腦程式產品 - Google Patents
光線追蹤方法與電腦程式產品 Download PDFInfo
- Publication number
- TWI719379B TWI719379B TW107146223A TW107146223A TWI719379B TW I719379 B TWI719379 B TW I719379B TW 107146223 A TW107146223 A TW 107146223A TW 107146223 A TW107146223 A TW 107146223A TW I719379 B TWI719379 B TW I719379B
- Authority
- TW
- Taiwan
- Prior art keywords
- node
- relay node
- nodes
- ray
- relay
- Prior art date
Links
Images
Landscapes
- Image Generation (AREA)
Abstract
本發明提出一種光線追蹤方法,包含了幾個特徵:第一,節省了光線與包圍體之間的相交測試的運算量;第二,節省了光線與三角形之間的相交測試的運算量;第三,父節點與子節點可共用一些邊界資訊;第四,對相鄰光線做預測;第五,以二元完滿樹來建構包圍體結構。上述特徵都可以減少光線追蹤的運算量。
Description
本發明是有關於一種光線追蹤的加速方法。
光線追蹤(Ray tracing)是三維電腦圖學中顯示場景的演算法,做法是跟蹤從眼睛發出的光線而不是光源發出的光線,藉此可以生成高品質的三維場景畫面。光線追蹤的原理是從感測器往每個像素射出主要光線,並判斷主要光線與所有的場景物件是否相交。除了主要光線以外,還需要判斷陰影光線與次要光線是否與其他物件相交,其中陰影光線是用以判斷場景物件與光源之間是否有其他物件,次要光線則是根據場景物件的材質來計算反射或是折射。因此,光線追蹤通常具有非常高的計算量,如何減少光線追蹤的運算量,為此領域技術人員所關心的議題。
本發明的實施例提出一種光線追蹤方法,適用於一電子裝置,此光線追蹤方法包括:根據三維物件建立一包圍體結構,此包圍體結構包括多個節點,包括根節點、中
繼節點與葉節點,每一個中繼節點至少記錄了多筆邊界距離與多個位元,位於用以表示中繼節點的邊界距離分別相同於中繼節點的左子節點或右子節點;以及走訪包圍體結構,其中在走訪包圍體結構的第一中繼節點時,對第一中繼節點的左子節點與右子節點做相交測試,相交測試用以根據包圍體的邊界距離判斷包圍體是否與光線相交,其中第一中繼節點的左子節點與右子節點的部份邊界距離是從第一中繼節點取得以避免重複計算。
offset y =O y ×S y -O x ...(9)
offset z =O z ×S z -O x ...(10)
其中x_min為包圍體的X軸最小邊界值、x_max為包圍體的X軸最大邊界值、y_min為包圍體的Y軸最小邊界值、y_max為包圍體的Y軸最大邊界值、z_min為包圍體的Z軸最小邊界值、z_max為包圍體的Z軸最大邊界值,向量
(Ox,O y ,O z )表示一原點。其中相交測試是用以判斷、、是否都大於、、,若判斷結果都為是,則表示光線相交於包圍體。
在一些實施例中,上述的光線追蹤方法,更包括執行三角形相交測試,此三角形相交測試包括建立以下聯立方程式(11)。
其中A、B、C分別為三角形的三端點,P為在三角形上的一點,u、v為變數。三角形相交測試還包括:根據方程式(11)得到以下方程式(12)、(13)的解,並執行以下方程式(14)、(15)、(16)。
u=Qux×P x +Qu y ×P y +Qu z ...(12)
v=Qvx×P x +Qv y ×P y +Qv z ...(13)
其中Qux、Qu y 、Qu z 、Qvx、Qv y 、Qv z 為常數。三角形相交測試還用以判斷u'、v'、w'是否皆大於0並小於1,若是則判斷光線相交於三角形。
在一些實施例中,上述的光線追蹤方法,更包括:若光線只和第一中繼節點的左子節點相交,將一目前節點設定為第一中繼節點的左子節點並繼續走訪包圍體結構;若光線只和第一中繼節點的右子節點相交,將目前節點
設定為第一中繼節點的右子節點並繼續走訪包圍體結構;若光線和第一中繼節點的左子節點與右子節點相交,將第一中繼節點的右子節點與相對應的邊界距離加入至堆疊中,將目前節點設定為第一中繼節點的左子節點並繼續走訪包圍體結構;以及若光線並沒有和第一中繼節點的左子節點或右子節點相交,從堆疊從取得一節點與多筆邊界距離以做為目前節點並繼續走訪包圍體結構。
在一些實施例中,每一個中繼節點還記錄一預測旗標,光線追蹤方法還包括:當走訪至第一中繼節點時,判斷第一中繼節點的預測旗標是否為命中;若第一中繼節點的預測旗標為命中,判斷第一中繼節點與光線相交而不對第一中繼節點執行相交測試;以及若第一中繼節點的預測旗標為不命中,對第一中繼節點執行相交測試。
在一些實施例中,上述的光線追蹤方法更包括:若第一中繼節點的預測旗標為不命中且第一中繼節點與光線不相交,設定第一中繼節點的預測旗標為不命中;若第一中繼節點的預測旗標為命中或第一中繼節點與光線相交,判斷光線是否相交於第一中繼節點的所有子節點;若光線與第一中繼節點的其中一子節點相交,設定第一中繼節點的預測旗標為命中;以及若光線與第一中繼節點的所有子節點都不相交,設定第一中繼節點的預測旗標為不命中。
在一些實施例中,上述的光線追蹤方法,更包括:在走訪包圍體結構之前,取得先前光線以及與先前光線相交的成像三角形;以及若光線相交於成像三角形,在走訪
包圍體結構時排除比成像三角形更遠的節點。
在一些實施例中,上述的光線追蹤方法,更包括:將包圍體結構切割為多個二元完滿子樹,其中每一個節點屬於對應的二元完滿子樹;以廣度優先的方式來設定二元完滿子樹中的節點的辨識碼;以及將節點分類為三類。第一類表示對應的二元完滿子樹的中繼節點,第二類表示對應的二元完滿子樹的根節點,第三類表示葉節點。
在一些實施例中,上述第二類的節點紀錄對應的二元完滿子樹的子樹資訊,此子樹資訊包括位址與深度。光線追蹤方法還包括:在走訪至第一二元完滿子樹時,根據第一二元完滿子樹的子樹資訊來計算出第一二元完滿子樹中節點的記憶體位址。
以另外一個角度來說,本發明提出一種電腦程式產品,由一電子裝置執行以完成以下步驟:根據三維物件建立一包圍體結構,其中包圍體結構包括根節點、中繼節點與葉節點,每一個中繼節點至少記錄了多筆邊界距離與多個位元,這些位元用以表示中繼節點的邊界距離分別相同於中繼節點的左子節點或右子節點;以及走訪包圍體結構,其中在走訪包圍體結構的第一中繼節點時,對第一中繼節點的左子節點與右子節點做相交測試,相交測試用以根據一包圍體的邊界距離判斷包圍體是否與光線相交,第一中繼節點的左子節點與右子節點的部份邊界距離是從第一中繼節點取得以避免重複計算。
為讓本發明的上述特徵和優點能更明顯易懂,
下文特舉實施例,並配合所附圖式作詳細說明如下。
100‧‧‧電子裝置
110‧‧‧處理器
120‧‧‧記憶體
210‧‧‧主要光線
220‧‧‧觀察者
230‧‧‧畫面
240‧‧‧場景物件
250‧‧‧次要光線
260‧‧‧陰影光線
270‧‧‧光源
300‧‧‧包圍體結構
N1~N4、L5~L9‧‧‧節點
P1~P12‧‧‧三角形
510‧‧‧包圍體
520、530、540‧‧‧光線
710、810‧‧‧父節點
711、712、811、812‧‧‧子節點
910‧‧‧節點
911~925‧‧‧欄位
1010‧‧‧推疊
1501~1505‧‧‧步驟
1600‧‧‧包圍體結構
1601~1605‧‧‧二元完滿子樹
1710、1720、1730‧‧‧節點
1711~1713、1721~1725、1731~1734‧‧‧欄位
1801、1802‧‧‧步驟
[圖1]是根據一實施例繪示電子裝置的示意圖。
[圖2]是根據一實施例繪示追蹤場景內光線的示意圖。
[圖3]是根據一實施例繪示包圍體結構的示意圖。
[圖4]是根據一實施例繪示場景中包圍體與三角形的示意圖。
[圖5]是根據一實施例繪示光線相交於包圍體的示意圖。
[圖6]是根據一實施例繪示光線沒有相交於包圍體的示意圖。
[圖7]與[圖8]是根據一實施例繪示父節點與子節點共用邊界值的示意圖。
[圖9]是根據一實施例繪示中繼節點的資料結構示意圖。
[圖10]至[圖13]是根據一實施例繪示走訪包圍體結構的示意圖。
[圖14]是根據一實施例繪示光線與三角形相交的示意圖。
[圖15]是根據一實施例繪示更新預測旗標的流程圖。
[圖16]是根據一實施例繪示包圍體結構的示意圖。
[圖17]是根據一實施例繪示各種節點所儲存的資訊。
[圖18]是根據一實施例繪示光線追蹤方法的流程圖。
關於本文中所使用之『第一』、『第二』、...等,並非特別指次序或順位的意思,其僅為了區別以相同技術用語描述的元件或操作。
圖1是根據一實施例繪示電子裝置的示意圖,電子裝置100包括了處理器110與記憶體120。電子裝置100可以是智慧型手機、平板電腦、個人電腦、筆記型電腦、工業電腦或具有計算能力的各種電子裝置等,本發明並不在此限。處理器110可以為中央處理器、微處理器、微控制器、數位信號處理器、影像處理晶片、特殊應用積體電路等。記憶體120中儲存有程式碼,處理器110用以執行這些程式碼來執行一光線追蹤方法。
圖2是根據一實施例繪示追蹤場景內光線的示意圖。請參照圖2,在光線追蹤方法中,主要光線210由觀察者(或稱原點)220射出,這些主要光線210會通過畫面230中的像素而射向一個三維空間當中。首先需要判斷主要光線210是否與三維空間中的場景物件240相交,此外次要光線250是根據場景物件240的材質計算折射或反射出去的光線,陰影光線260則是用以判斷場景物件240與光源270之間是否有其他物件。當畫面230的解析度越高,主要光線210的數目也越高,次要光線250的數目與主要光線210的數目
有關,陰影光線260的數目則與光源數量有關。在此實施例中每一個物件是由多個三角形所構成,換言之上述每一條光線都需要判斷是否與構成物件的三角形相交,因而會產生龐大的計算量,以下所提出的光線追蹤方法便是用以減少這些計算量。
[第一實施例]
首先介紹包圍體結構,包圍體結構是根據場景中的三維物件所建立,目的是要將場景中的物件分群。舉例來說,圖3是根據一實施例繪示包圍體結構的示意圖,圖4是根據一實施例繪示場景中包圍體與三角形的示意圖。請參照圖3與圖4,為了簡化起見,在圖4中是以二維影像來繪示這些三角形P1~P12,相近的三角形會被分到同一個包圍體中,在此實施例中包圍體的種類為軸對齊邊界框(axis-alignment bounding box,AABB)。包圍體結構300是實作為二元樹,包括了中繼節點N1~N4與葉節點L5~L9,每個節點都是一個包圍體,中繼節點N1又被稱為根節點,而葉節點L5~L9則包含了對應的三角形。例如,葉節點L8包含了三角形P5~P7,以此類推。在此,相交測試是用以判斷包圍體是否與一條光線相交,若光線並沒有和包圍體相交,也就不會和此包圍體的所有子節點和三角形相交,藉此可以節省計算量。舉例來說,若一條光線沒有相交中繼節點N3,就不需要判斷光線是否相交於葉節點L6、L7。若一條光線沒有相交於葉節點L8,就不需要判斷光線是否相交於三角形P5~P7。
一般來說,每個中繼節點與葉節點會包含多個欄位。中繼節點的欄位紀錄了種類、左子節點指標、右子節點指標、X軸最大邊界值、X軸最小邊界值、Y軸最大邊界值、Y軸最小邊界值、Z軸最大邊界值、Z軸最小邊界值。上述的種類是用以指示此節點是中繼節點或是葉節點。左子節點指標是用以紀錄左子節點的編號,右子節點指標是用以紀錄右子節點的編號。葉節點的欄位紀錄了種類、三角形編號、三角形個數、X軸最大邊界值、X軸最小邊界值、Y軸最大邊界值、Y軸最小邊界值、Z軸最大邊界值、Z軸最小邊界值。三角形編號所記錄的是三角形編號的起點,三角形個數指的是在此葉節點內有幾個三角形,若這兩個欄位所儲存的值分別為5、4,則表示此葉節點包含了編號為5、6、7、8一共四個三角形。
上述的邊界值是用以判斷光線是否與包圍體相交。具體來說,圖5是根據一實施例繪示光線相交於包圍體的示意圖,圖6是根據一實施例繪示光線沒有相交於包圍體的示意圖。為了簡化起見,在圖5與圖6是以二維空間為例,包圍體510具有X軸最大邊界值Max_x、X軸最小邊界值Min_x、Y軸最大邊界值Max_y、Y軸最小邊界值Min_y。換言之,包圍體510具有四個邊界軸x=Max_x、x=Min_x、y=Max_y、y=Min_y,接著計算光線520與這四個邊界軸的距離,分別為Rx_max、Rx_min、Ry_max、Ry_min。如果光線與最大邊界軸之間的距離都大於光線與最小邊界軸之間的距離,則表示光線有經過包圍體510,反之則是沒
有經過包圍體510。例如,在圖5的實施例中,Rx_max大於Rx_min且Ry_max大於Ry_min,因此光線520相交於包圍體510;在圖6的實施例中,光線530所對應的Ry_max小於Rx_min,光線540所對應的Rx_max小於Ry_min,因此光線530、540都沒有相交於包圍體510。
在三維空間中是計算光線與包圍體的六個面之間的距離,如以下方程式(1)~(6)所示。
Rx_min=(x_min-Ox)/Dx…(1)
Rx_max=(x_max-Ox)/Dx…(2)
Ry_min=(y_min-Oy)/Dy…(3)
Ry_max=(y_max-Oy)/Dy…(4)
Rz_min=(z_min-Oz)/Dz…(5)
Rz_max=(z_max-Oz)/Dz…(6)
其中光線是表示為向量(Dx,Dy,Dz),而(Ox,Oy,Oz)則表示原點的座標。x_max為包圍體的X軸最大邊界值、x_min為X軸最小邊界值,y_max為包圍體的Y軸最大邊界值、y_min為Y軸最小邊界值,z_max為包圍體的Z軸最大邊界值、z_min為Z軸最小邊界值。類似的是,如果光線與最大邊界值之間的距離都大於光線與最小邊界值之間的距離,則表示光線有經過包圍體,反之若有一個條件不成立則表示光線沒有經過包圍體。
在上述方程式(1)~(6)中共需要6個減法與6個除法,但除法需要較大的運算量,因此在此實施例中先取光線向量的倒數(1/Dx,1/Dy,1/Dz),用這倒數與其他數字相乘,
如此一來便省去了6個除法。此外,可以將此向量作正規化成為(1,Dx/Dy,Dx/Dz),進一步的減少運算量。雖然這樣做所計算出來的距離是經過正規化後的數值,並不是真正的距離,但在相交測試中所要判斷的是距離之間的大小,因此上述正規化並不會影響判斷的結果。最後,將方程式(1)、(2)中所需要扣除的常數項移至方程式(3)~(6)當中便可以得到以下方程式(7)~(16)。
offset y =O y ×S y -O x ...(15)
offset z =O z ×S z -O x ...(16)
在相交測試時,是判斷、、是
否都大於、、,若都成立則表示光線相交於包圍體,若有一個判斷結果為否,則表示光線並沒有相交於包圍體。對於同一條光線,上述方程式(13)~(16)的結果都不會改變且會被重複使用,因此在一些實施例中可以將這些結果儲存於內部記憶體中以用於光線與其他節點的相交測試。經過上述簡化以後,對於光線與節點之間的相交測試只需要4個乘法與4個減法,相較於原本需要6個乘法與6個除法來說減省了許多計算量。
圖7與圖8是根據一實施例繪示父節點與子節點共用邊界值的示意圖。請參照圖7與圖8,由於包圍體分割的依據是三角形在場景中的位置,因此包圍體的四個邊界中必定存在至少一個三角形,而此節點所包含的子節點由於仍然包含位於邊界的那些三角形,因此可以得出父節點的邊界值必定與子節點有重複的結論。在圖7中,父節點710包含了子節點711、712,其中子節點711、712的8個邊界值中有4個邊界值與父節點710的邊界值相同。在圖8中,父節點810包含了子節點811、812,其中子節點811、812的8個邊界值中有6個邊界值與父節點810的邊界值相同。當父節點與子節點的邊界值相同時,所計算出的距離也會相同。例如,在上述方程式(8)中,當父節點與子節點的X軸最大邊界值x_max相同時,所計算出的距離也會相同。
為了讓父節點與子節點的邊界值能夠共用,包圍體結構中每個中繼節點需要額外記錄一些資訊。圖9是根據一實施例繪示中繼節點的資料結構示意圖。請參照圖9,
中繼節點910包括了多個欄位911~925,在欄位旁邊的數字“1”、“w”表示對應的欄位所需要的位元數,其中w為正整數,因此欄位912~919都需要w個位元,而欄位911、920~925只需要一個位元。欄位911~913分別記錄了種類、左子節點指標、右子節點指標,其意義以說明如上,在此並不再重複。欄位914~919分別記錄X軸最大邊界距離、X軸最小邊界距離、Y軸最大邊界距離、Y軸最小邊界距離、Z軸最大邊界距離、Z軸最小邊界距離,其計算方式如以上方程式(7)~(12)所述。欄位920~925紀錄了多個位元,分別表示父節點的邊界距離相同於左子節點或右子節點的邊界距離,在此實施例中是用位元“1”來表示左子節點,“0”來表示右子節點。舉例來說,如果父節點的X軸最大邊界距離相同於左子節點的X軸最大邊界距離,則欄位920可記錄“1”,其餘欄位921~925可以此類推。
為了符合改良後的資料結構,走訪節點的演算法也需要修改,特別的是在本實施例中一次會對兩個節點做相交測試。圖10至圖13是根據一實施例繪示走訪包圍體結構的示意圖。以包圍體結構300為例,對於根節點N1而言,由於他不是任何節點的子節點,故視為特殊情況處理,在開始走訪時,單獨對根節點N1做相交測試。
在對根節點N1做完相交測試以後會得到6筆邊界距離,這些邊界距離在與後續的相交測試中會用到,因此必須先儲存起來。請參照圖10,若測試結果表示光線與此根節點N1相交,則接下來對根節點N1的左子節點N2與右子
節點N3做相交測試,測試結果指出兩個中繼節點N2、N3都與光線相交,因此先將中繼節點N3與其邊界距離放入堆疊1010當中,並繼續處理中繼節點N2。特別的是,中繼節點N2、N3所對應的部份邊界距離可以從根節點N1取得,藉此避免重複運算。請參照圖11,接下來對中繼節點N2的左子節點N4和右子節點L5做相交測試,同樣地左子節點N4和右子節點L5的部份邊界距離可以從節點N2取得,藉此避免重複運算。由於葉節點L5並沒有與光線相交,因此不會放入至推疊1010當中。接著,請參照圖12,對葉節點L8、L9做相交測試。然後,請參照圖13,從堆疊1010中取出中繼節點N3,接下來對葉節點L6、L7做相交測試。
若採用習知的走訪演算法,一開始先測試光線是否與根節點N1相交,如果測試結果為是,則繼續測試光線是否與中繼節點N2、N3相交。若光線與中繼節點N2、N3都相交,可以先將其中一個中繼節點N3放入推疊當中,並且先測試另一個中繼節點N2。由於光線與中繼節點N2相交,且同時只能對一個節點做相交測試,因此只能先把葉節點L5存入至堆疊1010中,並對中繼節點N4進行相交測試。然而,節點L5並未與光線相交,因此放入推疊1010的動作是多餘的。本實施例提出的走訪演算法不只可以節省運算量,也可以減少推疊1010的讀寫次數。
綜合來說,目前進行相交測試的節點稱為目前節點,在走訪第一中繼節點時,是對第一中繼節點的左子節點與右子節點做相交測試,其中左子節點與右子節點的部份
邊界距離是從第一中繼節點取得以避免重複計算。若光線只和第一中繼節點的左子節點相交,將目前節點設定為第一中繼節點的左子節點並繼續走訪包圍體結構;若光線只和第一中繼節點的右子節點相交,將目前節點設定為第一中繼節點的右子節點並繼續走訪包圍體結構;若光線和第一中繼節點的左子節點與右子節點都相交,將第一中繼節點的右子節點與相對應的邊界距離加入至堆疊中,將目前節點設定為第一中繼節點的左子節點並繼續走訪包圍體結構;以及若光線並沒有和第一中繼節點的左子節點或右子節點相交,從堆疊從取得一節點與邊界距離以做為目前節點並繼續走訪包圍體結構。
接下來說明如何判斷光線與三角形相交,即三角形相交測試。圖14是根據一實施例繪示光線與三角形相交的示意圖。請參照圖14,O為原點,表示為向量。A、B、C分別為三角形的三個端點,P為光線1410與此三角形的交點,表示為向量。為此三角形所屬平面的法向量,可正規化為。u、v為變數。大致上來說,必須要先找到三角形的平面方程式,再計算出光線1410與此平面方程式的交點P,接著利用邊界方程式來判斷交點P是否在三角形ABC內,若是則表示光線1410與三角形ABC相交。
其中t'、d'為實數。交點P的X座標與Y座標可以分別表示為以下方程式(20)、(21)。
Px=Ox+t'…(20)
Py=O y +t'×D' y …(21)
v=Qvx×P x +Qv y ×P y +Qv z …(24)
其中Qux、Qu y 、Qu z 、Qvx、Qv y 、Qv z 為常數。接下來,將方程式(23)、(24)分別改寫為以下方程式(25)、(26),再執行方程式(27)。
接下來,判斷u'、v'、w'是否皆大於0並小於1,若是則判斷光線1410相交於三角形ABC。在一些實施例
中,由於三角形與光線相交的前提是u'、v'、w'都為正,因此只要其中一個值為負,不論其他的值為多少,結果都是不相交。因此,如果在計算u'、v'、w'其中一個值以後便可以去查看其正負號,便可能省下其餘的計算量。跟習知技術相比,採用u'、v'、w'可以減少至少一個乘法的計算量。
[第二實施例]
光線追蹤技術在成像時,每個像素都是由主要光線、陰影光線以及次要光線相交於場景中的物件所形成。由於像素之間的距離很近,因此從像素發出的光線也很相近,這導致在走訪包圍體結構時,相鄰的光線可能會有相同的相交結果。在此實施例中,是採用先前光線的相交結果來預測目前光線的相交測試,藉此可以節省計算量。
具體來說,在此實施例中的每個中繼節點還額外地包含一欄位,用以紀錄一預測旗標,此預測旗標用以指示“命中”(HIT)或是“不命中”(MISS)。如果預測光線不相交於此中繼節點,則預測旗標則為不命中,實作上可以填入位元“1”或是“0”,本發明並不在此限。當預測旗標為命中時,便可以判斷目前光線與此中繼節點相交,因而可以省略目前光線與此中繼節點的相交測試。當預測旗標為不命中時,還是需要對此中繼節點做相交測試,這是因為我們只能接受節點實際上是不相交但被預測為命中的錯誤,但不能接受節點實際上是相交但被預測為不命中的錯誤,前者只會增加計算量,但後者會導致成像錯誤。
在初始狀態,包圍體結構中所有中繼節點的預
測旗標都設定為不命中。當光線相交於某一中繼節點時,此中繼節點的預測旗標就會被設定為命中,當下一條光線走訪至此中繼節點時便會直接判斷為相交而省去相交測試的運算量。此外,當中繼節點的所有子節點與光線都不相交時,此中繼節點的預測旗標會被設定為不命中。具體來說,圖15是根據一實施例繪示更新預測旗標的流程圖。請參照圖15,在走訪至某一個中繼節點(亦稱第一中繼節點)時,先執行步驟1501,判斷此第一中繼節點的預測旗標是否為不命中。如果預測旗標為不命中,則對此第一中繼節點執行相交測試,並在步驟1502判斷相交測試的結果是否為不相交。如果光線與此第一中繼節點不相交,則在步驟1503中將第一中繼節點的預測旗標設定為不命中(MISS)。如果步驟1501的判斷結果為命中或在步驟1502中判斷第一中繼節點與光線相交,則進行步驟1504,判斷光線是否相交於第一中繼節點的所有子節點。如果光線與第一中繼節點的其中一個子節點相交,則在步驟1505中設定第一中繼節點的預測旗標為命中。如果光線與第一中繼節點所有的子節點都不相交,則在步驟1503中設定第一中繼節點的預測旗標為不命中。值得注意的是,在此實施例中並不預測葉節點的相交狀況,這是如果葉節點實際上為不相交但被預測為命中的代價是要對葉節點中所有的三角形做相交測試,這樣額外產生的運算量太大。
根據上述預測旗標的機制,在步驟1504還需要對子節點做相交測試才能確定第一中繼節點的預測旗標,因
此在第二實施例中會一次走訪兩個節點,這點和第一實施例相同。如果第一中繼節點的兩個子節點都與光線相交,則選擇較近的子節點當作目前節點,把較遠的子節點加入至堆疊當中。如果只有一個子節點與光線相交,則把此子節點當作目前節點,並且繼續走訪。值得注意的是,在對第一中繼節點的子節點做相交測試時,如果子節點為另一中繼節點(亦稱第二中繼節點),則可以直接參照第二中繼節點的預測旗標。
在一些實施例中,對於三角形相交測試也可以進行預測。我們假設目前光線有很高的機率會相交於先前光線的成像三角形,因為成像三角形是距離光線原點最近的三角形,如果目前光線也相交於先前光線的成像三角形便可以排除距離較遠的節點,也可以排除那些節點以下所有的三角形。具體來說,在走訪包圍體結構之前,可取得先前光線以及與先前光線相交的成像三角形。若目前光線相交於此成像三角形,在走訪包圍體結構時排除比成像三角形更遠的節點。本領域具有通常知識者當可根據節點的座標來判斷其他三角形是否較遠於成像三角形,本發明並不再贅述。
在光線追蹤技術中,需要經常地從記憶體取得子節點的辨識碼,如果包圍體結構是一個二元完滿樹(full binary tree),則可以直接計算出子節點的辨識碼,不需要存取記憶體。然而,一般的包圍體結構受限於三角形的分佈,幾乎不可能形成一顆完滿樹。請參照圖16,圖16是根據一實施例繪示包圍體結構的示意圖。在此實施例中,包圍
體結構1600被切割為多個二元完滿子樹1601~1605,並且每一個節點都屬於一個對應的二元完滿子樹。此外,在此是以廣度優先(breadth first)的方式來設定二元完滿子樹中節點的辨識碼,例如先設定二元完滿子樹1601的節點辨識碼1~6,再設定二元完滿子樹1602的節點辨識碼7~8,再設定二元完滿子樹1603的節點辨識碼9~14,以此類推。在此是盡量切割出深度最大的子樹,例如二元完滿子樹1601、1603包括了7個節點。
在切割成二元完滿子樹1601~1605以後,每個節點可分為三種類型。第一類表示二元完滿子樹的中繼節點,例如節點1、2、9、10(為簡化起見,以下以節點內所繪示的數字來稱呼特定節點)。第二類表示二元完滿子樹的根節點,例如節點0、3、4、6、15。第三類表示葉節點,例如節點5、7、8、11~14、16~18。不同種類的節點會儲存不同的資訊。圖17是根據一實施例繪示各種節點所儲存的資訊。請參照圖17,第一類的節點1710包括了欄位1711~1712,分別記錄邊界值或邊界距離(標記為x,y,z axes)、分割位元(標記為split)、預測旗標(標記為pred)。其中分割位元是用以判斷哪些子節點離原點更近。第二類的節點1720包括了欄位1721~1725,分別記錄邊界值或邊界距離、節點種類(標記為type)、分割位元、預測旗標、以及子樹資訊(標記為sub-tree),此子樹資訊包括了位址(標記為address)與深度(標記為depth)。第三類的節點1730包括了欄位1731~1734,分別記錄邊界值或邊界距離、節點種
類、三角形指標(標記為triangle pointer)、三角形數目(標記為triangle number)。值得注意的是,在此不需要儲存第一類節點的子節點指標,因為子節點的記憶體位址可以根據子樹資訊計算出,當要計算子節點的記憶體位址時,只需要考慮子節點與根節點之間偏移了多少位元。舉例來說,在取得節點0以後,從節點0的子樹資訊可以得知二元完滿子樹1601的深度為2,因此節點1、2必定為第一類節點。如果要計算出節點2的記憶體位置,可以將節點0的長度(即節點的大小)加上節點1的長度即可。如此一來,可以節少記憶體的存取次數。
圖18是根據一實施例繪示光線追蹤方法的流程圖。請參照圖18,在步驟1801中,根據三維物件建立包圍體結構。在步驟1802中,走訪包圍體結構。然而,關於包圍體結構的建立與走訪可以採用上述第一實施例或第二實施例,其細節已詳細說明如上,在此便不再贅述。
以另外一個角度來說,本發明也提出了一電腦程式產品,此產品可由任意的程式語言及/或平台所撰寫,當此電腦程式產品被載入至電子裝置100並執行時,可執行上述的光線追蹤方法。
雖然本發明已以實施例揭露如上,然其並非用以限定本發明,任何所屬技術領域中具有通常知識者,在不脫離本發明的精神和範圍內,當可作些許的更動與潤飾,故本發明的保護範圍當視後附的申請專利範圍所界定者為準。
300‧‧‧包圍體結構
1010‧‧‧推疊
N1~N4、L5~L9‧‧‧節點
Claims (10)
- 一種光線追蹤方法,適用於一電子裝置,該光線追蹤方法包括:根據三維物件建立一包圍體結構,其中該包圍體結構包括多個節點,該些節點包括一根節點、多個中繼節點與多個葉節點,每一該些中繼節點至少記錄了多筆邊界距離與多個位元,該些位元用以表示該中繼節點的該些邊界距離分別相同於該中繼節點的左子節點或右子節點;以及走訪該包圍體結構,其中在走訪包圍體結構的該些節點中的一第一中繼節點時,對該第一中繼節點的左子節點與右子節點做相交測試,該相交測試用以根據一包圍體的邊界距離判斷該包圍體是否與一光線相交,該第一中繼節點的該左子節點與該右子節點的部份邊界距離是從該第一中繼節點取得以避免重複計算。
- 如申請專利範圍第1項所述之光線追蹤方法,其中該光線表示為向量(Dx,Dy,D z ),該相交測試包括以下方程式(1)~(10):
- 如申請專利範圍第1項所述之光線追蹤方法,更包括:若該光線只和該第一中繼節點的該左子節點相交,將一目前節點設定為該第一中繼節點的該左子節點並繼續走訪該包圍體結構;若該光線只和該第一中繼節點的該右子節點相交,將該目前節點設定為該第一中繼節點的該右子節點並繼續走 訪該包圍體結構;若該光線和該第一中繼節點的該左子節點與該右子節點相交,將該第一中繼節點的該右子節點與相對應的該些邊界距離加入至一堆疊中,將該目前節點設定為該第一中繼節點的該左子節點並繼續走訪該包圍體結構;以及若該光線並沒有和該第一中繼節點的該左子節點或該右子節點相交,從該堆疊從取得一節點與多筆邊界距離以做為該目前節點並繼續走訪該包圍體結構。
- 如申請專利範圍第1項所述之光線追蹤方法,其中每一該些中繼節點還記錄一預測旗標,該光線追蹤方法還包括:當走訪至該第一中繼節點時,判斷該第一中繼節點的該預測旗標是否為命中;若該第一中繼節點的該預測旗標為命中,判斷該第一中繼節點與該光線相交而不對該第一中繼節點執行該相交測試;以及若該第一中繼節點的該預測旗標為不命中,對該第一中繼節點執行該相交測試。
- 如申請專利範圍第5項所述之光線追蹤方法,更包括:若該第一中繼節點的該預測旗標為不命中且該第一中繼節點與該光線不相交,設定該第一中繼節點的該預測 旗標為不命中;若該第一中繼節點的該預測旗標為命中或該第一中繼節點與該光線相交,判斷該光線是否相交於該第一中繼節點的所有子節點;若該光線與該第一中繼節點的其中一子節點相交,設定該第一中繼節點的該預測旗標為命中;以及若該光線與該第一中繼節點的該些所有子節點都不相交,設定該第一中繼節點的該預測旗標為不命中。
- 如申請專利範圍第6項所述之光線追蹤方法,更包括:在走訪該包圍體結構之前,取得一先前光線以及與該先前光線相交的一成像三角形;以及若該光線相交於該成像三角形,在走訪該包圍體結構時排除比該成像三角形更遠的該些節點。
- 如申請專利範圍第1項所述之光線追蹤方法,更包括:將該包圍體結構切割為多個二元完滿子樹,其中每一該些節點屬於該些二元完滿子樹的其中之一;以廣度優先的方式來設定該些二元完滿子樹中的該些節點的辨識碼;以及將該些節點分類為:第一類,表示對應的該二元完滿子樹的中繼節點; 第二類,表示對應的該二元完滿子樹的根節點;以及第三類,表示該些葉節點。
- 如申請專利範圍第8項所述之光線追蹤方法,其中該第二類的每一該些節點紀錄對應的該二元完滿子樹的子樹資訊,該子樹資訊包括位址與深度,該光線追蹤方法還包括:在走訪至該些二元完滿子樹的第一二元完滿子樹時,根據該第一二元完滿子樹的該子樹資訊來計算出該第一二元完滿子樹中節點的記憶體位址。
- 一種電腦程式產品,由一電子裝置執行以完成多個步驟:根據三維物件建立一包圍體結構,其中該包圍體結構包括多個節點,該些節點包括一根節點、多個中繼節點與多個葉節點,每一該些中繼節點至少記錄了多筆邊界距離與多個位元,該些位元用以表示該中繼節點的該些邊界距離分別相同於該中繼節點的左子節點或右子節點;以及走訪該包圍體結構,其中在走訪包圍體結構的該些節點中的一第一中繼節點時,對該第一中繼節點的左子節點與右子節點做相交測試,該相交測試用以根據一包圍體的邊界距離判斷該包圍體是否與一光線相交,該第一中繼節點的該左子節點與該右子節點的部份邊界距離是從該第一中繼節點取得以避免重複計算。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
TW107146223A TWI719379B (zh) | 2018-12-20 | 2018-12-20 | 光線追蹤方法與電腦程式產品 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
TW107146223A TWI719379B (zh) | 2018-12-20 | 2018-12-20 | 光線追蹤方法與電腦程式產品 |
Publications (2)
Publication Number | Publication Date |
---|---|
TW202025092A TW202025092A (zh) | 2020-07-01 |
TWI719379B true TWI719379B (zh) | 2021-02-21 |
Family
ID=73004994
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
TW107146223A TWI719379B (zh) | 2018-12-20 | 2018-12-20 | 光線追蹤方法與電腦程式產品 |
Country Status (1)
Country | Link |
---|---|
TW (1) | TWI719379B (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100053162A1 (en) * | 2000-06-19 | 2010-03-04 | Holger Dammertz | Accelerated ray tracing using shallow bounding volume hierarchies |
US8188996B2 (en) * | 2000-06-19 | 2012-05-29 | Mental Images Gmbh | Shallow bounding volume hierarchies for accelerated ray tracing |
CN106233338A (zh) * | 2014-04-21 | 2016-12-14 | 高通股份有限公司 | 用于光线跟踪应用中的树遍历的开始节点确定 |
CN108475441A (zh) * | 2016-01-22 | 2018-08-31 | 英特尔公司 | 光线追踪期间的详细级别选择 |
-
2018
- 2018-12-20 TW TW107146223A patent/TWI719379B/zh active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100053162A1 (en) * | 2000-06-19 | 2010-03-04 | Holger Dammertz | Accelerated ray tracing using shallow bounding volume hierarchies |
US8188996B2 (en) * | 2000-06-19 | 2012-05-29 | Mental Images Gmbh | Shallow bounding volume hierarchies for accelerated ray tracing |
CN106233338A (zh) * | 2014-04-21 | 2016-12-14 | 高通股份有限公司 | 用于光线跟踪应用中的树遍历的开始节点确定 |
CN108475441A (zh) * | 2016-01-22 | 2018-08-31 | 英特尔公司 | 光线追踪期间的详细级别选择 |
Also Published As
Publication number | Publication date |
---|---|
TW202025092A (zh) | 2020-07-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10706608B2 (en) | Tree traversal with backtracking in constant time | |
US11715255B2 (en) | Intersection testing in a ray tracing system using ray bundle vectors | |
CN108701367B (zh) | 单遍次包围体阶层光栅化 | |
US11315303B2 (en) | Graphics processing | |
US11551412B2 (en) | Systems and methods for traversing implied subdivision hierarchical level of detail content | |
CN112949477B (zh) | 基于图卷积神经网络的信息识别方法、装置及存储介质 | |
US11282260B2 (en) | Bounded volume hierarchy (BVH) tree traversal using spatial division | |
US20220392145A1 (en) | Graphics processing | |
JP2023516983A (ja) | 部分的に常駐する境界ボリューム階層 | |
US11798221B2 (en) | Graphics processing | |
CN116529775A (zh) | 用于光线追踪的合并函数调用的方法和装置 | |
US20220392146A1 (en) | Graphics processing | |
TWI719379B (zh) | 光線追蹤方法與電腦程式產品 | |
US9519992B2 (en) | Apparatus and method for processing image | |
US11756257B2 (en) | Intersection testing in ray tracing systems with skipping of nodes in sub-trees of hierarchical acceleration structures | |
US11682160B2 (en) | Intersection testing in a ray tracing system using multiple ray bundle intersection tests | |
US11403803B2 (en) | Hierarchical acceleration structures for use in ray tracing systems | |
US20240127527A1 (en) | Ray tracing | |
US11741659B2 (en) | Intersection testing in a ray tracing system using three-dimensional axis-aligned box | |
US20240161385A1 (en) | Ray tracing | |
EP3929880A2 (en) | Hierarchical acceleration structures for use in ray tracing systems | |
CN116630502A (zh) | 关系图渲染方法、装置、设备、介质和程序产品 |