我有完整填充的深度纹理,但似乎没有从中获得适当的值。
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 :(得分:3)
深度纹理的类型是GL_DEPTH_COMPONENT,GL_FLOAT
这没有任何意义。 GL_FLOAT
不是OpenGL image format。 GL_DEPTH_COMPONENT
是一种图像格式,但它是一种未经过格式化的格式。它指定了未指定大小的无符号标准化整数深度格式。
GL_FLOAT
可能就是你在glTexImage调用中从结尾开始的第二个参数,对吗?那是pixel transfer参数;它描述了您要复制到纹理的像素数据,而不是像素数据存储在纹理中的方式。 OpenGL可以在许多不同类型的数据格式之间进行转换。
如果您的深度数据来自渲染到深度缓冲区,那么您必须了解如何从非线性投影后空间转换为线性预投影空间,然后才能对该数据执行有意义的操作。 This answer显示了如何进行转化。