2013-08-28 101 views
0

我做了延遲渲染的第一步,即fbo機智顏色,法線,位置和深度紋理。但是當我進行照明時,位置隨着我移動和旋轉。 第一遍頂點:延遲渲染位置重建

void main(){ 
    gl_Position=gl_ModelViewProjectionMatrix*gl_Vertex; 
    vec4 positiontotexture = gl_ModelViewProjectionMartix*gl_Vertex; 
} 

那麼我怎樣才能得到原來的位置呢?

回答

2

我認爲positiontotexture會去片段着色器,然後保存在紋理。

第一次通過時,最好有View位置,而不是ViewProjection。您可以使用:

vec4 positiontotexture = gl_ModelViewMartix*gl_Vertex; 

在第二遍,那麼你可以使用:

vec3 position = texture(texPos, vVaryingTexCoord0.xy).rgb; 

以前的方法是相當簡單的(但學習時,這是件好事),但需要大量的內存(你必須存儲3元素矢量)。 更好的方法是從屏幕位置/深度重新創建視圖位置:link to article。這種技術被用於現代發動機中。 (感謝andon-m-coleman您的建議)

這裏是我的回購一些基本的延期:https://github.com/fenbf/efg_deferred/tree/master/code/shaders

+0

@Csoki:肯定更喜歡第二種方法,一個額外的G緩衝區有足夠的精確度來存儲視圖/世界空間位置會絕對破壞你的內存帶寬需求。沒有商業圖形引擎使用這種方法,它們都從深度緩衝區和投影矩陣重建位置。 –

+0

@ AndonM.Coleman更新了帖子,感謝您的評論 – fen