2013-02-04 91 views
1

我試圖通過將屏幕空間點投影到視圖空間以用於照明來避免使用位置緩衝區。我已經嘗試乘以逆投影矩陣,但是這並沒有給出視圖空間點。添加矩陣乘法以避免位置緩衝區值得嗎?是延遲渲染所需的位置緩衝區嗎?

最後通着色:

vec3 ScreenSpace = vec3(0.0,0.0,0.0); 
ScreenSpace.xy = (texcoord.xy * 2.0) - 1.0; 
ScreenSpace.z = texture2D(depthtex, texcoord.xy); 
vec4 ViewSpace = InvProjectionMatrix * vec3(ScreenSpace, 1.0); 
ViewSpace.xyz = ViewSpace.w; 

回答

2

大多數答案都可以在this answer可以發現,這是遠遠太長,涉及到重新發布。但是,您的部分問題是您使用的是texcoord而不是gl_FragCoord

你想用gl_FragCoord,因爲這是由OpenGL的保證是正確的值(假設你的遞延通和與同尺寸的照明通使用的圖像),不管是什麼。此外,它使您無需將頂點着色器中的值傳遞給片段着色器。

的缺點是你所需要的輸出畫面的大小來解釋它。但是,that's easy enough,再次假設兩個通道使用相同尺寸的圖像:

ivec2 size = textureSize(depthtex, 0); 

可以使用size視口的大小,以gl_FragCoord.xy轉換成紋理座標和窗口空間中的位置。

+0

嘿,這樣計算出的UV座標看起來更準確,我在做什麼是頂點着色器texcoord =((gl_ModelViewProjectionMatrix * gl_Vertex)+1.0)/2.0 – erai