2013-05-10 15 views
5

Uso un buffer di profondità logaritmico: nel mio shader ho scritto il codice descrive here.Buffer profondità logaritmica

Nella vertex shader:

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

nello shader frammento:

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

Ora, in uno dei miei algoritmi (SSAO che funziona bene con un buffer di profondità classico), voglio recuperare la profondità del mio frammento. Ecco la formula che uso:

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; 

Tuttavia, non funziona, l'algoritmo non funziona più. Sai se la z che ho calcolato è la profondità corretta?

risposta

7

Come hai preparato gl_ModelViewProjectionMatrix? Se hai usato quello standard, vertexPosClip.z conterrà la profondità già proiettata e quindi errata.

Senza modificare la matrice, è possibile utilizzare il componente che contiene w profondità positiva nella scena:

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

Il calcolo di z dal valore depth buffer sembra essere corretto, semplicemente non dimenticare che stanno ottenendo una profondità positiva nella scena, non negativa come lo è in OpenGL.

Problemi correlati