【问题标题】:Why can't I get values from depth texture using FBO?为什么我不能使用 FBO 从深度纹理中获取值?
【发布时间】:2013-10-19 22:03:13
【问题描述】:

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

设置
1.制作pass1 FBO(颜色纹理+深度纹理)
2.制作pass2 RBO(color renderbuffer + depth renderbuffer)

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

Setup.1 代码(创建 pass0 fbo)

glActiveTexture(GL_TEXTURE0);
glGenTextures(2, &pass1_tex);
glBindTexture(GL_TEXTURE_2D, pass1_tex[0]);
glTexImage2D(GL_TEXTURE_2D, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, pass1_tex[1]);
glTexImage2D(GL_TEXTURE_2D, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
glGenFramebuffers(1, pass1_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, pass1_fbo);
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);

为了在渲染中获得深度值,我做了如下操作:

glBindFramebuffer(GL_FRAMEBUFFER, pass1_fbo);
// vertex processing..
glActiveTexture(GL_TEXTURE1);
glGetTexImage(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, GL_FLOAT, &debug_buf[0]);

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

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

【问题讨论】:

  • 嗯,你能发布实际编译的代码吗? glBindFramebuffer 将帧缓冲区绑定到上下文;它只需要两个参数。另外,如果那应该是glFramebufferTexture,那么您将使用与颜色和深度相同的纹理,我敢肯定这是不合法的。你在检查帧缓冲区的完整性吗?最后,当您尝试调用 glGetTexImage 时,您从未绑定过深度纹理
  • 深度缓冲区将始终具有 [-1.0 .. 1.0] 的值范围,无论近值和远值如何(至少只要 near

标签: opengl


【解决方案1】:

您可以找到问题的答案in this article。使用 GL_COMPARE_R_TO_TEXTURE 时,对深度纹理进行采样会返回深度纹理值与参考值(即插值的 r 纹理坐标)的比较结果。您要做的是指定以下纹理参数:

glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
glTexParameteri (GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);   

【讨论】:

【解决方案2】:
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);

您对颜色和深度缓冲区都使用了颜色纹理 pass1_tex[0]

【讨论】:

  • 我不会过多地阅读他的代码。该函数的参数数量完全错误,最后一个参数看起来像是模板声明的开始,但考虑到GL_TEXTURE_2D 的定义方式以及&gt; 不存在的事实,它仅评估常量@987654324 @大于pass_tex [0]的值,这可能是一个没有意义的比较:)
猜你喜欢
  • 2013-11-22
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
相关资源
最近更新 更多