如何从深度纹理中获取深度值?

时间:2011-08-30 09:20:49

标签: opengl glsl

我有完整填充的深度纹理,但似乎没有从中获得适当的值。

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。有什么问题?我认为从纹理中获取深度值的解决方案是错误的,但我不知道原因。存储在哪里的深度值?我怎样才能获得深度值?

1 个答案:

答案 0 :(得分:3)

  

深度纹理的类型是GL_DEPTH_COMPONENT,GL_FLOAT

这没有任何意义。 GL_FLOAT不是OpenGL image formatGL_DEPTH_COMPONENT是一种图像格式,但它是一种未经过格式化的格式。它指定了未指定大小的无符号标准化整数深度格式。

GL_FLOAT可能就是你在glTexImage调用中从结尾开始的第二个参数,对吗?那是pixel transfer参数;它描述了您要复制到纹理的像素数据,而不是像素数据存储在纹理中的方式。 OpenGL可以在许多不同类型的数据格式之间进行转换。

如果您的深度数据来自渲染到深度缓冲区,那么您必须了解如何从非线性投影后空间转换为线性预投影空间,然后才能对该数据执行有意义的操作。 This answer显示了如何进行转化。