GAMES101-現代計算機圖形學入門-閆令琪 - lecture14 光線追蹤2 - 加速結構(Ray Tracing 2 - Acceleration) - 課後筆記

光線追蹤2 - 加速結構(Ray Tracing 2 - Acceleration)

  • 對AABB結構優化來加速光線追蹤的速度
    • 均勻網格(Uniform grids)
    • 空間劃分(Spatial partitions)

均勻空間劃分(Uniform Spatial Partitions)

上一節課中,使用了AABB包圍盒的方式來判斷物體,然後判斷光線是否和包圍盒相交,如果和包圍盒相交,再判斷是否和內部的物體相交。均勻空間劃分就是直接使用了這個思想。

比如有下面這個場景:
在這裏插入圖片描述

  • 先找到整個場景的包圍盒
    在這裏插入圖片描述
  • 然後在進行任何光線追蹤的計算之前,先對整個包圍盒進行一個預處理,將其分爲許多均勻的網格。
    在這裏插入圖片描述
  • 劃分格子之後,判定哪些格子裏可能有物體,即哪些格子和物體的表面相交。
    在這裏插入圖片描述
  • 處理之後,就可以知道哪些格子裏有物體,然後就可以開始進行光線追蹤,比如一條光線朝着右上方射進來,可以看到光線經過了一些盒子,有的盒子和物體有交點,有的盒子與物體沒有交點。光線經過的與物體有交點的盒子,就判斷光線是否和盒子內的物體是否有交點。也就是說光線只要進行若干次和盒子的求交,就避免了和場景中的所有物體進行求交,也就加快了速度。
    在這裏插入圖片描述
  • 也有人會問如何判斷光線經過哪些格子,最最簡單的思路是這樣:因爲光線是朝着右上方射入的,每次只要判斷當前經過格子的右邊,上邊和右上邊的三個格子即可。可以從中找到光線經過了哪些格子。這個過程其實就是在光柵化的過程中如何畫一條線的方法。

這個結構的加速能力,其實就是多做一些光線與盒子的求交,從而減少光線與物體的求交。那麼如何判斷加速效果怎麼樣?可以看下面的幾種情況:

  • 只有一個1 × 1 的格子:如果只有一個格子,則還是要將光線與每個物體求交,沒有起到加速的效果。
    在這裏插入圖片描述
  • 如果格子很密集,就會增加光線與格子求交的次數,效率也會降低。
    在這裏插入圖片描述
    所以格子的數量也不是越多越好,根據前人的實驗經驗可以得出,格子的數量最好如下:
    在這裏插入圖片描述
    當場景中的物體比較密集時,使用這種劃分爲格子的效果很好,如下:
    在這裏插入圖片描述
    但是當場景比較空曠,就會出現一個問題,稱作“在廣場中的茶壺”問題(“Teapot in a stadium” problem) 。因爲將一個空曠的場景劃分爲許多格子,而物體比較少,例如一個大廣場之中只有一個格子裏包含有物體的時候,再用光線和格子求交的效率就會很低,如果在都是空氣的地方都用大一些的格子,而在物體比較密集的地方用小一些的格子,這樣就能夠獲得一個更好的效果,所以就需要別的方法。

空間劃分(Spatial Partitions)

空間劃分有以下幾種方法:
在這裏插入圖片描述

  • Oct - Tree(八叉樹):先用一個包圍盒把整個場景包起來,然後切成八份(在三維空間中橫豎一刀,一共就是八份,二維的空間上就是4份,如圖),然後對每一個子節點,再切成四塊,圖中只畫了左上角切了,其實每一個都要切。但是什麼時候停下來不切了?有不同的標準,比如說右下角一大塊什麼都沒有,就可以停下來不切了,左上角比較密集,就多切幾刀。直到劃分到某一個格子沒有物體或者只有少數物體,就可以停下來了。這就把空間切成了一個不均勻的塊,並且組成了一個樹。但這個方法並不好用。
  • KD - Tree :KDTree做的和八叉樹類似,但是每次只沿着一條軸砍一刀,分成兩塊。不斷重複水平一刀豎直一刀的過程。整個空間就被劃分成了一個二叉樹的結構。爲什麼要交替的進行水平和數值的劃分?因爲這樣可以保證空間基本上是個均勻的劃分方式,如果只沿着水平或者數值方向,則到最後就會把空間分成那種長條狀的,這種劃分方式就不好。如果三維空間種,就是先X軸,再Y軸,再Z軸的順序進行劃分。
  • BSP - Tree:對空間是採用二分的方法,每次選一個方向,將一個節點劈成兩半。但是空間會分爲很多種斜的空間,因爲採用AABB的方式能夠比較容易的計算交點,斜着的空間計算交點比較麻煩,所以這個方法不好。維度越高越麻煩。

KD - Tree的預處理

在這裏插入圖片描述
KD - Tree的預處理的方式如上所示(在光線追蹤之前完成)

  • A是整個最大的包圍盒,將A切成藍色的1和包圍盒B(實際上1也要再切,但是這裏爲了講述過程,只需要切一邊即可,下面也都是如此),並作爲1的兩個子節點
  • B是由2、3、4、5組成的一個包圍盒,將B水平切成C和區域2,並作爲B的兩個子節點
  • C是由3、4、5組成的一個包圍盒,將C切成區域3和包圍盒D,作爲C的兩個子節點
  • D是由4、5組成的包圍盒,將D切成4、5,作爲D的兩個子節點。

我們可以看到,KD-Tree最終將整個場景構成了一個二叉樹的結構,那麼就需要考慮應該用什麼樣的數據結構來存儲整個場景的信息。

KD - Tree的數據結構

  • 非葉節點存儲的數據:
    • 劃分軸:x,y,z軸
    • 劃分的位置:劃分平面在空間中的座標
    • 指向子節點的指針
    • 在非葉節點中不存儲物體
  • 葉節點存儲的數據:
    • 葉節點對應的區域內包含的物體

在KD - Tree處理好的區域中進行光線追蹤

在這裏插入圖片描述
過程如下面幾張圖所示:
在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

這整個過程就是在判斷光線與樹上的節點所對應的範圍是否有交點,如果和一個子節點所在的範圍沒有交點,那麼就不再判斷光線和這個子節點所在的子樹是否有交點;如果和一個光線和子節點對應的範圍有交點,則:1.如果這個子節點是非葉節點,那麼繼續重複上面的步驟,判斷該節點的子節點是否和光線有交點。2.如果這個子節點是葉子節點,則判斷光線和該葉子節點中存儲的物體是否有交點

KD - Tree的缺陷

  • 由於每一個子節點都要存儲在其對應區域內的物體的信息,就會導致同一個物體被多個葉節點存儲,浪費了多餘的空間。比如上圖中一個圓與三個盒子相交,那麼這三個盒子都要存儲這個圓的信息。
  • 判斷三角形和盒子的相交存在一定的問題。比如說,如果認爲一個三角形和一個盒子相交,只要三角形的某一個頂點在盒子裏我們就認爲三角形和這個盒子相交,但是會出現三角形的三個頂點都不在盒子裏,但是三角形仍然和盒子相交,比如有一個很大的三角形將盒子包圍了起來;這種情況下要建立KD - Tree就會比較困難。

後來人們發現了還有另一種辦法可以避免上述的缺陷,所以就引入了物體劃分

物體劃分(Ojbect Partitions) - Bounding Volume Hierarchy(BVH)

BVH這種加速結構是目前運用最廣泛的一種方法,其原理如下:
在這裏插入圖片描述
與上面的加速結構一樣,需要先找一個包圍盒把整個場景包圍起來,並作爲樹的根節點。
在這裏插入圖片描述
然後根據三角形的數量,而並非是空間,將三角形分爲兩堆,再分別用兩個包圍盒包圍起來,作爲樹的兩個子節點。
在這裏插入圖片描述
接着再重複上面的過程,將包圍盒的三角形分成兩堆,左邊的黃色區域也要劃分,不過這裏只是爲了說明就沒有劃分。

這種方式就避免了KD - Tree中物體重複存儲的問題,上面的圖中可以看到,雖然三角形可能和其他的包圍盒存在交集,但是每個三角形都只被一個包圍盒完整的包圍出來。不同的包圍盒之間交集越少,則說明這次劃分的效果就越好。關於怎麼劃分,很有講究。

總結一下,BVH的過程就是:

  • 先找到一個大的包圍盒包圍整個場景
  • 遞歸的把包圍盒根據物體的數量劃分爲兩個部分
  • 重新計算劃分後的兩個部分的包圍盒
  • 停止條件:達到必要的條件即可,比如:當葉子節點內部只要有足夠少的三角形即可
  • 物體依舊存儲在葉子節點裏

如何劃分?

  • 選擇一個維度進行劃分,比如現在x軸劃分,再在y軸劃分
  • 選擇包圍盒最長的那個維度進行劃分,比如有一個長條狀的包圍盒,就沿着垂直於這個軸的方向進行劃分,儘量將空間的大小劃分的均勻,而不是都是劃分成長條狀
  • 選擇中間的那個物體作爲劃分點。比如我有一排三角形,就選擇在處在中位數位置的三角形作爲劃分點;或者說在空間上有許多三角形,我可以沿着某一個方向,比如沿着x軸方向求出三角形的中位數,以這個物體爲基礎劃分。這樣做的好處就是能夠儘量維持兩個包圍盒中的物體相同,也就能儘可能平衡這顆二叉樹,使最後形成的二叉樹深度最小,減少了搜查時間。
  • 如果場景動態或者場景發生變化,那就只能重新構建一個新的BVH

BHVs的數據結構

  • 非葉節點存儲數據
    • 包圍盒
    • 子節點指針
  • 葉節點存儲的數據
    • 包圍盒
    • 具體的物體

BVH算法

在這裏插入圖片描述

  • 如果光線和子節點的包圍盒沒有交點,什麼也不做直接返回
  • 如果過交點是葉子交點
    • 和包圍盒內所有的三角形求交
    • 返回距離最近的交點
  • 否則再遞歸的和子節點求交,返回最近的節點

空間劃分和物體劃分的區別

空間劃分:

  • 將空間劃分爲多個不重疊的區域
  • 一個物體可以被多個空間所包含

物體劃分:

  • 將物體劃分爲多個不相交的子集
  • 每個子集的包圍盒有可能與其他的包圍盒重疊

輻射度量學(Basic radiometry)

Radiant Energy and Flux(Power)

Radiant Energy:Radiant Energy是光源輻射出來的能量的總量,單位是焦耳(Q)。

Radiant Flux : Radiant Flux是單位時間內,光源輻射出來的能量,定義式如下:
在這裏插入圖片描述

Radiant Intensity

Radiant Intensity是單位時間內,光源向單位立體角(Solid Angles)所輻射出的能量。
在這裏插入圖片描述

角和立體角(Angles and Solid Angles)

角:角度對應的弧長/圓的半徑
在這裏插入圖片描述
立體角:球的某一個角度範圍對應的面積 / 球的半徑的平方
在這裏插入圖片描述

單位立體角(Differential Solid Angles)

在這裏插入圖片描述
dA的推導過程可以參考三重積分的球面積分法的推到過程,dw的則是按照立體角的定義所得。

值得注意的是,將這個球的立體角積分最後得到的結果是4PI,並且立體角只做一個向量使用,使用立體角代表從球心發出的光線指向的方向。
在這裏插入圖片描述
其它關係:
在這裏插入圖片描述

上式代表,將每個立體角方向的randiant Intensity積分起來得到就是radiant flux.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章