Ray Tracking 加速結構

基本原理中使用AABB作爲判斷光線和物體相交的加速。
在AABB內部如何快速判斷判斷光線和物體的相交情況呢?主要分爲種方法:

  • Uniform grids
  • Spatial partitions

注意這裏使用的加速結構是在光線追蹤之前做的準備工作。

Grids


分格子,然後記住每個格子裏有哪些物體。碰到格子的話,再和這個格子裏的物體求交。

這樣的話就沿着直線找就可以了(怎麼沿着直線?比如,線是右上的,找到一個格子後,往右找或者往上找)

那麼怎麼劃分是合理的呢?
一般認爲:

格子的劃分對排列整齊大小整齊的物體是work well的,但是對於分佈不均形狀複雜的是工作不好的。

Spatial Partitioning

這裏有一些比較經典的按照空間結構劃分的加速結構。
比如Oct-Tree(八叉樹),KD-Tree,BSP-Tree。
八叉樹是指把一個空間分爲8塊(3D空間下),但是八叉樹的問題是在不同空間維度下的分塊數是不同的。
KD-Tree是我先橫着切一刀,分成兩塊,再對每塊豎着切一刀分成兩塊,再橫着...直到切到我們規定的策略。
BSP-Tree是按照一個方向去切,分完之後再按另一個方向。

KD-Tree

KD-Tree是我先橫着切一刀,分成兩塊,再對每塊豎着切一刀分成兩塊,再橫着...直到切到我們規定的策略。下面是一個示意圖(A的左孩子應該也會被切直到滿足我們的條件,比如條件是有1個物體等等),其中我們存放的物體應該在葉子節點上:

求交的時候會先和父節點求交,如果和這個塊有交點再和孩子節點求交直到和葉子結點(物體)求交。

Object Partitions & Bounding Volume Hierarchy (BVH)

上面的空間劃分結構(以KD-Tree爲例)有兩個問題,一是物體可能散步在多個塊中;二是物體(三角面片)在不在這個塊中並不好判斷。
所以就誕生了使用物體作爲劃分的BVH這也是比較常用的Ray Tracking加速的作法。
它的主要想法是根據三角面做劃分,然後一堆三角面的包圍盒作爲一塊。這樣就解決了上面兩個問題。

PS:假如劃分按照物體的個數均分樹可能也會平衡些。也可以有一些別的劃分策略:

KD-Tree VS BVH

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