2010-09-08 100 views
25

所以我很重視我應該開始點亮我平淡的彩色模型。測試應用程序是僅實現最新方法的測試案例,因此我意識到理想情況下它應該實施光線追蹤(因爲理論上它可能是幾年內實時圖形的理想選擇)。如何在現代OpenGL中進行光線追蹤?

但我從哪裏開始?

假設我從來沒有在舊的OpenGL中完成光照,所以我將直接轉到非棄用的方法。

的應用目前已正確設置頂點緩衝對象,頂點,正常和顏色輸入並正確平在空間變換模型中,在平坦的顏色。

有一個信息來源,將採取一個從平面着色頂點所有需要經由GLSL正確的結果呢?理想情況下,可能需要其他任何其他照明方法來補充它。

回答

24

我不會建議嘗試實際光線在OpenGL跟蹤,因爲你需要爲很多黑客和技巧,如果你問我,有沒有在所有做了這點。 如果您想在GPU上進行光線追蹤,您應該使用任何GPGPU語言,例如CUDA或OpenCL,因爲它使事情變得更容易(但仍然很瑣碎)。

爲了進一步說明問題: 對於光線跟蹤,您需要跟蹤輔助光線並測試與幾何體的相交。因此,您需要在着色器中以某種巧妙的方式訪問幾何,但是在片段着色器中,如果不將其「編碼」存儲到幾何紋理中,則無法訪問幾何。頂點着色器本身不會爲您提供此幾何信息,並且幾何着色器僅知道鄰居,所以此處已經開始出現問題。 接下來,您需要加速數據結構來獲取任何合理的幀速率。然而,遍歷例如着色器中的Kd-Tree是相當困難的,如果我沒有記錯的話,那麼只有幾篇論文就是關於這個問題的。 但是,如果你真的想走這條路線,那麼這個話題有很多論文,找到它們不應該太難。

射線追蹤器需要非常精心設計的訪問模式和緩存才能達到良好的性能。但是,您對GLSL內部的這些內部控制很少,優化性能會變得非常困難。另一點需要注意的是,至少據我所知,GPU上的實時光線追蹤大多侷限於靜態場景,例如, kd-trees僅適用於靜態場景。如果你想擁有動態場景,你需要其他數據結構(例如BVH,iirc?),但你需要不斷地維護這些。如果我沒有遺漏任何東西,目前仍然有很多研究正在就此問題進行。

+4

順便說一句:谷歌學者是你這樣的東西的朋友。如何http://scholar.google.de/scholar?q=glsl+ray+tracing – zerm 2010-09-08 11:47:38

+3

OpenCL它是... – 2010-09-08 22:20:33

+0

你是什麼意思「加速度數據結構」? – bluejamesbond 2014-02-03 22:01:18

18

你可能會混淆一些事情。

OpenGL是一個光柵化器。強制它進行光線追蹤是可能的,但很困難。這就是爲什麼光線追蹤不是「幾年內實時圖形的理想選擇」。幾年後,只有混合動力系統纔可行。

所以,你有三種可能性。

  • 純光線追蹤。只渲染一個全屏四邊形,並在您的片段着色器中,讀取包含在緩衝區(如紋理)中的場景描述,遍歷層次並計算光線三角形交點。
  • 混合光線追蹤。柵格化場景中的正常方式,並在真正需要它(折射,...但它可以在光柵化simultated)
  • 純光柵化場景的某些部分着色器使用光線跟蹤。片段着色器執行其正常工作。

你到底要達到什麼樣的?我可以根據你的需要改進答案。

無論如何,this SO question是高度相關的。即使這個特定的實現有一個bug,它也是一個明確的路要走。另一種可能性是openCL,但概念是相同的。