2017-08-27 95 views
2

我想混合raymarching和通常的幾何渲染,但我不明白如何正確比較射線與存儲在緩衝區中的深度值的距離。OpenGL比較射線距離與深度緩衝區

This drawing will make it clear

在raymarching側,我已經從眼睛(紅點)開始射線。如果您只在固定的射線距離'T'上渲染碎片,則會看到一條曲線(在我的圖中爲黃色)。我明白這一點,因爲如果你從射線源Oa和Ob開始,並在T單位(Oa + T * Da和Ob + T * Db)期間遵循方向Da和Db,則只會看到中間的射線屏幕到達藍色平面。

現在在幾何方面,我直接從gl_FragCoord.z存儲值。但我不明白爲什麼我們在那裏看不到這種彎曲的效果。我用瘸子編輯了這張照片,用'posterize'功能來表達清楚。

make it clear

我們看到直線,而不是曲線。

我這個深度值轉換爲距離OK(考慮到線性化的)。但是,當比較兩個距離時,我的屏幕邊上出現了問題。

有一件事我與投影和如何深度值缺少被存儲...我假定深度值是從近平面以下從眼睛開始光線的方向的(重新映射)的距離。

編輯: 它似乎寫這個問題,幫我一下。我現在看到爲什麼我們沒有看到這種曲線對深度緩衝區的影響:因爲Near和Far之間的距離對於屏幕側面的光線較大。因此即使深度值相同(中間或側面屏幕),距離也不是。

因此,似乎我的問題來自我將深度轉換爲距離的方式。我用下面的:

float z_n = 2.0 * mydepthvalue - 1.0; 
float z_e = 2.0 * zNear * zFar/(zFar + zNear - z_n * (zFar - zNear)); 

然而,轉換後我還沒有看到這條曲線的效果,我需要爲我的射線距離比較。注意:此代碼不會考慮FragCoord.x和.Y,這是奇怪的,我...

+0

在OpenGL中,不變深度的表面是垂直於攝像機方向的*平面*,而不是球形殼體(這稱爲直線投影)。因此,從攝像機到平面上某一點的光線距離會隨着其與攝像機軸線的偏移距離而雙曲*變化。 – meowgoesthedog

回答

2

你過於複雜的問題。沒有「曲線效應」,因爲飛機不是彎曲的。術語zlitteraly描述它是什麼:在一些歐幾里德座標空間中的z座標。並且在這樣的空間z=C將形成與由該空間的距離xy跨越的平面平行,距離爲C

所以如果你想要某個點的距離,你還需要考慮xy座標。在眼睛空間中,攝像機通常位於原點,因此與攝像機的距離歸結爲length(x_e, y_e, z_e)(這當然是一種非線性操作,會產生您期望的「曲線」)。

+1

非常感謝!你是對的;我迷失了自我。一開始,我遵循[本教程](https://www.gamasutra.com/blogs/DavidArppe/20170405/295240/How_to_get_Stunning_Graphics_with_Raymarching_in_Games.php)。但我認爲它有一個錯誤。在它的GetDistanceFromDepth()函數中,完全像他只考慮z_e,而沒有考慮到uv(或文本本身所述的'rd')。 對於這個問題感興趣的人;有很好的來源:https://www.khronos.org/opengl/wiki/Compute_eye_space_from_window_space – Plaoy3D