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

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

最佳答案

depth texture's type is GL_DEPTH_COMPONENT, GL_FLOAT

这毫无意义。 GL_FLOAT 不是 OpenGL image format . GL_DEPTH_COMPONENT 是一种图像格式,但它是未调整大小的。它指定了一个未指定大小的无符号、规范化整数深度格式。

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

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

关于opengl - 如何从深度纹理中获取深度值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7241074/

相关文章:

opengl - openGL中的渲染金字塔

OpenGL:计算着色器工作组是否并行执行?

java - 定义相机/对象 z 位置时的一般约定是什么

ios - 在 OpenGL ES 2.0 GLSL 中转置 mat4

javascript - WebGL:使用索引导致模型消失

java - 尝试使用 VBO "array vertex_buffer_object must be disabled to call this method"时出错

opengl - 如何在3D世界中拿起鼠标

opengl - GLSL 内存屏障()

c++ - 视差映射 - GLSL- OpenGL

c++ - 以不同的方式转换同一3D空间中的两个对象?