【问题标题】:How can I get depth value from depth texture?如何从深度纹理中获取深度值?
【发布时间】:2011-11-06 15:38:05
【问题描述】:

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

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

【问题讨论】:

  • 调试这类东西的一个有用技巧:与其直接乘以depth,不如乘以fract(depth),这样您就可以确定值是否超出[0..1]范围开始。
  • 顺便说一句,你的代码中还有一个错字,viewport.h应该是viewport_h...也许你使用depth时着色器没有编译?

标签: opengl glsl


【解决方案1】:

深度纹理的类型是 GL_DEPTH_COMPONENT, GL_FLOAT

这毫无意义。 GL_FLOAT 不是 OpenGL image formatGL_DEPTH_COMPONENT 是一种图像格式,但它是无尺寸的。它指定了一个未指定大小的无符号、标准化整数深度格式。

GL_FLOAT 可能是您在 glTexImage 调用中从末尾数第二个参数中放入的内容,对吧?那就是pixel transfer参数;它描述了您要复制到纹理的像素数据,而不是像素数据存储在纹理的方式。 OpenGL 可以在多种不同的数据格式之间进行转换。

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

【讨论】:

    猜你喜欢
    • 2013-09-15
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多