2011-08-30 73 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显示如何执行转换。