2013-06-25 70 views
1

我想從我的深度重建我的xyz。這樣我才能從實際的片段中獲得位置。 我已經有了:從深度重建片段位置

  • 深度紋理
  • 功能深度線性深度

這是我的時刻計算自己的價值觀。 hfar是遠平面的高度,只有它的寬度。 vec2 tc是一個ndc載體

float LinearizeDepth (vec2 coord) 
{ 
     float z = texture2D(depthTexture, coord*ssaoScale).x; 
     float d = (2.0 * near)/(far + near - z * (far - near)); 
     return d; 
} 

     float z = gl_FragCoord.z; 

     vec3 ray = vec3(x, y, z); 

     return ray;      
} 

    vec2 screenPos = vec2(gl_FragCoord.x/1024.0, gl_FragCoord.y/512.0); 
    vec3 origin = getViewRay(screenPos) * lineardepth; 

但是起源似乎不正確。 這裏是一個js.fiddle

http://jsfiddle.net/Peters_Stuff/s24TT/

我試圖通過http://mynameismjp.wordpress.com/2009/03/10/reconstructing-position-from-depth/閱讀但我感到困惑,甚至更多。我不想要一個解決方案或東西,只是一個正確的方式:)

有什麼建議嗎?


編輯:

我實現了建議:

vec3 origin = vec3(vec4(screenPos, texture2D(depthTexture, screenPos).x, 1.0) * invPerspectiveMatrix).xyz; 

所以產地應該是我的片段觀看空間中的位置。這看起來正確嗎?我不知道輸出應該是什麼樣子


編輯2:

這裏是一個小提琴: http://jsfiddle.net/Peters_Stuff/8ddkt/

我渲染全屏四和生成texturecoords和頂點着色器中的頂點並將它們傳遞給片段着色器。在那裏,我計算我的出身一樣,

vec3 origin = vec3(vViewRay.xy * 0.5 + 0.5 , linearDepth); 

vViewray必須歸到[0..1] 當前結果


編輯3:

我目前正在實施SSAO,如你可以在上面的着色器的其餘部分看到。如果這是正確的話,我不明白爲什麼當前outocome是這樣的:http://www.imgbox.de/users/public/images/ahmqLHYbvm.jpg 小提琴着色器http://jsfiddle.net/Peters_Stuff/8ddkt/

我創建一個隨機向量我的噪聲紋理,使用格拉姆施密特過程計算切線,產生生成變換矩陣。

然後通過samplekernel並查看樣本是否被遮擋。

float range_check = abs(origin.z - sampleDepth); 
    if (range_check < radius && sampleDepth <= sample.z) { 
     occlusion += 1.0 ; 
    } 

點應該只被遮擋,如果:

  • 從origin.z減去第samplepoint到表面的距離的距離的半徑內
  • 在採樣點的深度是比sample.z小
+0

圖像看起來像藍色的組件總是0.您是否提供了一些深度圖?如果你想要viewSpace協調,你不必乘以inverseProjMat。 –

+0

是的,我有一個深度圖(非線性)。如果需要,我也有一個函數來使值成爲線性的。上圖:texture2D(depthTexture,screenPos);這將是非線性值 – Pris0n

+0

編輯答案。如果可能的話,在jsfiddle後面仍然有不清楚的地方。 –

回答

2
(x,y,z) -> clip volume 

projMat * xyz = clip_coord; 

// - - - - - - 

clip_coord.x = gl_FragCoord/screenWidth; 
clip_coord.y = gl_FragCoord/screenHeight; 
clip_coord.z = texture2D(depthMap, clip_coord.xy); 

xyz = inverseProjMat * clip_coord; 

編輯:

http://goo.gl/AG7UO

這是一通,但不會完全一樣的東西兩個通的事情,但因爲它是一個一傳就沒有重建,只是varying。在片段切換z FragColor的組件之間0.0kK實際上是一個深度組件。與0.0它是綠色的紅色,但與k它改變顏色相當多,所以你張貼的圖像可能不正確(不是你想要的)。

希望這會有所幫助。

+0

我是對的,如果我不將inversProjMat與clip_coord相乘xyz最終成爲片段的視圖空間位置? 這就是我實際尋找的:) – Pris0n

+0

如果您從左側乘以projMat,則不應該從右側乘以inverseProjMat。 –

+0

更新了我的問題 – Pris0n