2013-05-10 26 views
5

Tôi sử dụng bộ đệm độ sâu logarit: trong trình đổ bóng của tôi, tôi đã viết mã mô tả here.Bộ đệm độ sâu lôgarit

Trong vertex shader:

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

Trong shader đoạn:

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

Bây giờ trong một trong những thuật toán của tôi (SSAO mà hoạt động tốt với một bộ đệm sâu cổ điển), tôi muốn khôi phục chiều sâu của mảnh của tôi. Đây là công thức tôi sử dụng:

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; 

Tuy nhiên nó không hoạt động, thuật toán không hoạt động nữa. Bạn có biết nếu z tôi đã tính toán là độ sâu chính xác?

Trả lời

7

Bạn đã chuẩn bị gl_ModelViewProjectionMatrix như thế nào? Nếu bạn sử dụng một tiêu chuẩn, vertexPosClip.z sẽ chứa độ sâu đã được chiếu, và do đó sai.

Nếu không có thay đổi ma trận, bạn có thể sử dụng thành phần w chứa sâu tích cực vào cảnh:

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

Việc tính toán z từ giá trị sâu đệm có vẻ là đúng, chỉ cần đừng quên bạn đang nhận được một chiều sâu tích cực vào cảnh, không phải là một tiêu cực như là tiêu chuẩn trong OpenGL.