2013-05-10 13 views
5

私は対数奥行きバッファを使用しています。私のシェイダーでは、コードはhereと書いてあります。フラグメントシェーダで対数奥行きバッファ

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

:バーテックスシェーダで

私のアルゴリズムのいずれか(古典的な深度バッファでうまく動作SSAO)で今

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)); 
} 

は、私が回復します私の断片の深さ。ここに私が使用する式があります:

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にはすでに投影されている深度が含まれているため、間違っています。

行列を修正することなく、あなたがシーンに正の深さが含まれていワットコンポーネントを使用することができます

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

をデプスバッファ値からのzの計算は正しいように思える、ちょうどあなたを忘れないでくださいシーンにプラスの深さをもたらしていますが、OpenGLでは標準であるような負のものではありません。

関連する問題