2013-05-10 216 views
5

我使用對數深度緩衝區:在我的着色器中,我寫的代碼描述了here對數深度緩衝區

在頂點着色器:

void main() 
{ 
    vec4 vertexPosClip = gl_ModelViewProjectionMatrix * gl_Vertex; 
    gl_Position = vertexPosClip; 
    gl_TexCoord[6] = vertexPosClip; 
} 

在片段着色器:

void main() 
{ 
    gl_FragColor = ... 
    const float C = 1.0; 
    const float far = 1000000000.0; 
    const float offset = 1.0; 
    gl_FragDepth = (log(C * gl_TexCoord[6].z + offset)/log(C * far + offset)); 
} 

現在,在我的算法之一(SSAO它採用了經典的深度緩衝效果很好),我想恢復我的片段的深度。下面是式I使用:

const float C = 1.0; 
    const float far = 1000000000.0; 
    const float offset = 1.0; 
//depth 
    z=(pow(C*far+offset,depth_in_depth_buffer)-offset)/C; 

但是它不工作,該算法不工作了。你知道我計算的z是否是正確的深度?

回答

7

你是如何準備gl_ModelViewProjectionMatrix的?如果你使用標準的,vertexPosClip.z將包含已經投影的深度,因此是錯誤的。

,而無需修改矩陣,可以使用包含正深入到現場w成分:

gl_FragDepth = (log(C * gl_TexCoord[6].w + offset)/log(C * far + offset)); 

從深度緩衝值z的計算似乎是正確的,只是不要忘記你在場景中獲得了積極的深度,而不是OpenGL中的標準。