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

3

我是一位有用的助手,可以为您翻译文本。

我已经完成了深度纹理的充分填充,但似乎没有得到一个恰当的值。

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]”范围。 - UncleZeiv
顺便提一下,你的代码中也有一个拼写错误,viewport.h 应该是 viewport_h... 也许当你使用 depth 时着色器没有编译成功? - UncleZeiv
1个回答

3
深度纹理的类型是GL_DEPTH_COMPONENT,GL_FLOAT。这没有意义。GL_FLOAT不是OpenGL图像格式。GL_DEPTH_COMPONENT是一种图像格式,但它是一种未定尺寸的格式。它指定了一个未指定大小的无符号、规范化整数深度格式。GL_FLOAT可能是您在glTexImage调用中倒数第二个参数中放置的内容。那是像素传输参数;它描述了您要复制到纹理的像素数据,而不是像素数据在纹理内部存储的方式。如果您的深度数据来自渲染深度缓冲区,则必须了解如何从非线性投影后空间转换为线性投影前空间,然后才能对该数据进行有意义的操作。这个答案展示了如何进行转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接