2011-08-30 76 views
1

我有完全的填充深度紋理,但似乎沒有得到它應有的價值。我怎樣才能從深度紋理深度值?

GLSL代碼片段着色器:

uniform sampler2D depth_tex; 
uniform float viewport_w; 
uniform float viewport_h; 

void main() 
{ 
    vec2 coord = vec2(gl_FragCoord.xy); 
    float depth = texture2D(depth_tex, vec2(coord.x/viewport_w, coord.y/viewport.h)).r; 
    float c = material_amb * depth; // material_amb is preset by host 
    out_color = vec4(c, c, c, 1.0f); 
} 

我希望模特的顏色會由頂點的深度可以改變,但我不能看到的一切。當然,我可以看到模型沒有倍增深度。深度紋理的類型是GL_DEPTH_COMPONENT,GL_FLOAT。有什麼問題?我認爲一個解決方案來獲得深度值從紋理是錯的,但我不知道原因。深度值在哪裏存儲?我怎樣才能獲得深度值?

+0

一個有用的提示來調試這種東西:而不是直接乘以'深度',乘以'fract(depth)',這樣你就可以計算出這些值是否超出'[0..1] '開始的範圍。 – UncleZeiv

+0

順便說一下,你的代碼中還有一個錯字,'viewport.h'應該是'viewport_h' ...也許着色器在你使用'depth'時不會編譯? – UncleZeiv

回答

3

深度紋理的類型是GL_DEPTH_COMPONENT,GL_FLOAT

這是沒有意義的。 GL_FLOAT不是OpenGL image formatGL_DEPTH_COMPONENT是圖像的格式,但它是一個未上漿的。它指定了未指定大小的無符號,標準化整數深度格式。

GL_FLOAT可能是你放什麼在參數二月底在您的通話glTexImage,對不對?那是pixel transfer參數;它描述了你拷貝到紋理的像素數據,而不是像素數據存儲的方式之內的紋理。 OpenGL可以在許多不同類型的數據格式之間進行轉換。

如果您的深度數據來自渲染到深度緩衝區,那麼您必須瞭解如何從非線性後投影空間轉換爲線性預投影空間,然後才能對該數據執行一些有意義的操作。 This answer顯示如何執行轉換。