我想從我的深度重建我的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.您是否提供了一些深度圖?如果你想要viewSpace協調,你不必乘以inverseProjMat。 –
是的,我有一個深度圖(非線性)。如果需要,我也有一個函數來使值成爲線性的。上圖:texture2D(depthTexture,screenPos);這將是非線性值 – Pris0n
編輯答案。如果可能的話,在jsfiddle後面仍然有不清楚的地方。 –