2013-05-10 19 views
5

Używam logarytmicznego bufora głębi: w moim module cieniującym napisałem kod opisujący here.Logarytmiczny bufor głębi

W vertex shader:

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

W cieniującego fragmentu:

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

teraz w jednym z moich algorytmów (SSAO, który działa dobrze z klasycznym bufora głębokości), chcę odzyskać głębia mojego fragmentu. Oto formuła, której używam:

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; 

Jednak to nie działa, algorytm już nie działa. Czy wiesz, czy obliczona przeze z jest poprawna głębia?

Odpowiedz

7

W jaki sposób przygotowałeś gl_ModelViewProjectionMatrix? Jeśli użyjesz standardowego, vertexPosClip.z będzie zawierać głębokość, która jest już rzutowana, a przez to błędna.

bez modyfikacji macierzy, można używać składnika W, która zawiera pozytywne głębokości na scenie:

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

Obliczanie oo od wartości bufora głębokości wydaje się być poprawne, po prostu nie zapomnę zyskują pozytywną głębię sceny, a nie negatywną, co jest standardem w OpenGL.