2011-12-20 55 views
1

我正在嘗試開發基本的Ray Tracer。有平面和布林 - 海防shading.i我工作的一個500 * 500的窗口,我的主要射線生成代碼如下使用GLSL進行RayTracing疑惑

vec3 rayDirection = vec3(gl_FragCoord.x-250.0,gl_FragCoord.y-250.0 , 10.0); 

到目前爲止,我已經計算出的路口現在我懷疑,上面的方法是對還是錯。請給我一些見解。

我也有疑問,我們需要構建幾何在OpenGL代碼,而在光線追蹤GLSL。例如,如果我想光線跟蹤一架飛機,我需要使用glVertex2f在OpenGL代碼中構建飛機嗎?

回答

2
vec3 rayDirection = vec3(gl_FragCoord.x-250.0,gl_FragCoord.y-250.0 , 10.0); 

現在我懷疑上述方法是對還是錯。請給我一些見解。

有沒有對錯與預測。您還可以將視口像素映射到方位角和仰角。其實你這樣做的方式並不是那麼糟糕。我只是通過一個額外的統一的視口尺寸,而不是硬編碼,並規範化矢量。 Z分量字面上像焦距一樣工作。

我也懷疑我們是否需要在GLSL中使用rayTracing的同時在OpenGL代碼中構造幾何圖形。例如,如果我想光線跟蹤一架飛機,我需要使用glVertex2f在OpenGL代碼中構建飛機嗎?

光線追蹤適用於包含整個場景的全局描述。然而,OpenGL原語純粹是局部的,也就是單個三角形,線或點,而OpenGL不維護場景數據庫。所以使用通常的OpenGL繪圖函數傳遞的幾何不能被光線追蹤(至少不是這樣)。

這是關於使用GLSL進行光線跟蹤的最大障礙:您需要實現一種方式來將整個場景作爲一些可自由訪問的緩衝區來實現。

+0

如果我硬編碼只在片段着色器我的場景描述?例如對於一架飛機,我可能只在片段着色器中存儲一個點並且正常! 現在我只想在實驗基礎上實現光線追蹤..稍後我可以將我的場景描述從OpenGL傳遞到統一陣列中的片段着色器。我的場景只會包含球體和飛機。 – 2011-12-20 14:03:04

+0

@AbhishekBansal:對場景進行硬編碼是ATM的常用方法,所以你很清楚。 – datenwolf 2011-12-20 14:11:15

1

它可以使用光線跟蹤渲染某些類型的複雜場景的一個單一的片段着色器。下面是一些例子:(使用Chrome或Firefox,需要WebGL的)

禮品盒:http://glsl.heroku.com/e#820.2

圓環之旅:http://glsl.heroku.com/e#794.0

聖誕樹:http://glsl.heroku.com/e#729.0

Modutropolis:http://glsl.heroku.com/e#327.0

的讓這些東西起作用的關鍵是寫出「距離函數」,告訴射手遊者距物體表面有多遠。關於距離函數的詳細信息,請參閱:

http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm

+3

Raymarching!=光線追蹤 – tigrou 2013-09-04 14:44:39