Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 为什么可以';我不能使用FBO从深度纹理中获取值吗?_Opengl - Fatal编程技术网

Opengl 为什么可以';我不能使用FBO从深度纹理中获取值吗?

Opengl 为什么可以';我不能使用FBO从深度纹理中获取值吗?,opengl,Opengl,我无法从FBO的深度纹理中获取深度值。。程序的工作流程如下所示: glBindFramebuffer(GL_FRAMEBUFFER, pass1_fbo); // vertex processing.. glActiveTexture(GL_TEXTURE1); glGetTexImage(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, GL_FLOAT, &debug_buf[0]); 设置 1.制作pass1 FBO(颜色纹理+深度纹理) 2.Make

我无法从FBO的深度纹理中获取深度值。。程序的工作流程如下所示:

glBindFramebuffer(GL_FRAMEBUFFER, pass1_fbo);
// vertex processing..
glActiveTexture(GL_TEXTURE1);
glGetTexImage(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, GL_FLOAT, &debug_buf[0]);
设置
1.制作pass1 FBO(颜色纹理+深度纹理)
2.Make pass2 RBO(颜色渲染缓冲+深度渲染缓冲)

渲染
1.仅顶点处理(pass1)
2.从pass0 FBO的深度纹理获取深度值
3.使用以前的深度值进行顶点和碎片处理

设置1代码(创建密码0 fbo)

但是,在debug_buf数组中只有1.0或0.0。当然,所有对象都在1.0和-1.0距离(NDC)之间,在透视图()中,近距离值和远距离值分别为1.0和2.0


为什么我不能从FBO的深度纹理中获得正确的深度值?

您可以找到问题的答案。使用GL_COMPARE_R_TO_纹理时,采样深度纹理将返回深度纹理值与参考值(即插值的R纹理坐标)的比较结果。您要做的是指定以下纹理参数:

glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
glTexParameteri (GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);   
glBindFramebuffer(GL_帧缓冲区、GL_颜色附件0、GL_纹理2D

您使用颜色纹理pass1_tex[0]作为颜色和深度缓冲区

Um,您可以发布实际编译的代码吗
glBindFramebuffer
将帧缓冲区绑定到上下文;它只需要两个参数。另外,如果这应该是
glFramebufferTexture
,那么您可以将相同的纹理作为颜色和深度,我很确定这是不合法的。您正在检查帧缓冲区的完整性吗?最后,当您尝试调用
glGetTexImage
时,您从未绑定深度纹理深度缓冲区的值范围始终为[-1.0..1.0],而不管近值和远值(至少只要近值<远值且两者都合理)。这就是规范化所做的。我不会对他的代码读太多。此函数的参数数量完全错误,最后一个参数看起来像模板声明的开始,但考虑到
GL\u TEXTURE\u 2D
的定义方式以及
不存在的事实,它仅计算常量
GL\u TEXTURE\u 2D
是否大于
pass\u tex[0]的值
,这可能是一个毫无意义的比较:)只是一个参考,默认的GL_DEPTH_TEXTURE_模式在主要OpenGL版本(2.x/3.x/4.x)和变体(ES 2.x/3.x)之间似乎有所不同。在桌面OpenGL 3.x/4.x以及OpenGL ES 3.x中,默认值为GL_RED。对于OpenGLES2.x,默认值是(我认为)GLU亮度。不过,似乎还有更多的恶作剧在上演,请阅读:和
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
glTexParameteri (GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);   
glBindFramebuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMEMNT0, GL_TEXTURE_2D< pass1_tex[0], 0);
glBindFramebuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMEMNT, GL_TEXTURE_2D< pass1_tex[0], 0);