2017-08-18 104 views
0

我寫我自己的3D遊戲引擎(我花了一年),我想創造我的CPU上運行的光線跟蹤(而不是GPU!)減少計算而光線追蹤

就目前而言,射線追蹤過程如下簡化:

  1. 爲每個輸出像素投射射線。
  2. 如果當前射線碰到物體,設置輸出像素的顏色爲「白色」
  3. 否則設置爲黑色

爲了提高光線跟蹤器的速度,我添加了一個球形邊界框每個實體。如果當前射線與邊界框相交,它將運行與實體的每個三角形的相交測試。

我在射線三角交點和射線點距離上使用了最快的方法,但每條射線都必須測試每個可能相交的實體的每個三角形。

因此,使用大約10000多個多邊形渲染一個對象(1920x1080)需要5分多鐘,我想這不是我想要的。

有什麼辦法減少我需要檢查的三角形數量嗎?

問候,芬蘭人

+0

你的問題是一個廣泛的問題,但我可以給你一些指示。有很多關於光線追蹤(計算機視覺)的論文,文章,......。您可以對此主題進行一些研究。有各種各樣的方法和方法。 – KarelG

+0

所以你基本上是說有一種方法可以減少多邊形的數量,而不是條目的數量。我會試一試:)謝謝 – Luecx

+0

你現在正在進入加速度數據結構,主要是Bounding Volume Hierarchy和K-d樹。你可以在這個主題上找到大量關於sciencedirect和ieee上k-d樹遍歷的研究論文。 –

回答

1

有沒有減少,我需要檢查三角形的量的方法嗎?

是的。

這聽起來像你的場景由三角列表組成,並且你正在線性迭代列表並檢查每個三角形以找到最接近的三角形。這是線性搜索並具有運行時間,n =三角形的數量。

您可以通過使用volumetric kd-treesbounding volume hierarchies存儲您的三角形,從而減少該平均O(log(n))時間。就個人而言,我更喜歡kd-trees,但任何一種方法都可行。請注意,BVH通常在動畫場景中表現更好。

請注意,加速結構可能包含構造或遍歷的細微缺陷,因此您可能需要開發一些方法來使用樸素列表方法(用於參考圖像)和結構化方法呈現相同的場景。在我的愛好追蹤器中,我這樣組織:

AbstractScene - 所有場景類型的基類。大多數代碼僅與AbstractScene字段和方法交互。

KDScene - 將場景實現爲kd-tree的派生類。

​​- 將場景實現爲BVH的派生類。

NaiveScene - 將場景實現爲三角形列表的派生類。

還有其他加速結構,如grids (aka voxels)

+0

我見過KD-Trees,但是在兩個新創建的盒子之間的分割上正確的三角形會發生什麼? – Luecx

+0

你必須決定如何處理邊緣情況:)有優點和缺點,但最重要的是保持一致。 –

+0

我昨天實施了KD-Tree,我可以從40000-1000減少我的三角形數量。這真的很好,但不是很好。這是因爲我的邊緣情況。現在我決定在節點中保留我的邊三角形,而不是讓它們失效。這導致我的第一個節點有500個三角形,但我很好:)非常感謝你:) – Luecx