把包圍盒分成很多個小格子,當小格子與物體表面相交時,就標記該格子。
當光線進入包圍盒時,就會不停的和一路上的小格子發生交互,如果小格子裏有物體,就判斷光線是否與物體交互,如果沒有交互則繼續前進,如果發生交互就記錄並返回。
由於在某些地方比較空曠,所以對空曠地區的劃分並不需要太細,對比較密集的區域才劃分細一些
使用KD-Tree來建立加速結構,建立KD-Tree過程
對包圍盒沿着軸方向進行劃分,中間節點不存儲物體,只在葉子節點存儲物體信息
在KD-Tree中查找光線與物體的求交,需要在光線前進的方向不停的與包圍盒檢測。
但KD-Tree有一個比較嚴重的問題。包圍盒中有些物體是與包圍盒有交集,因爲場景物體是由三角形構成,而很難判斷三角形與包圍盒有交集。
於是使用另外的一種加速結構BVH,它根據場景中的物體進行劃分,這樣就避免了判斷三角形是否與包圍盒有交集。
構造BVH的過程:把一個包圍盒切分成兩部分,重新計算這兩個部分的包圍盒,不斷切分下去,直到包圍盒內的三角形足夠少
怎麼樣對一個節點劃分,選取最長的那個軸,根據中位數進行劃分。
中間節點存儲包圍盒和指向子節點的指針,葉子節點存儲包圍盒和三角形
僞代碼:判斷光線與BVH根節點是否相交,如果不相交則直接返回,接着判斷相交的是否是葉子節點,如果是就判斷光線是否與葉子節點內的物體相交。
如果不是葉子節點,就遞歸到子節點去判斷。