【问题标题】:Unable to render depth texture无法渲染深度纹理
【发布时间】:2013-08-09 04:13:56
【问题描述】:

我在使用 opengl 中的帧缓冲区渲染深度纹理时遇到问题,我自己找不到问题。

设置如下:

//initialize color texture
glGenTextures(1, &color_buffer);
glBindTexture(GL_TEXTURE_2D, color_buffer);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_FLOAT, NULL); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); 
glBindTexture(GL_TEXTURE_2D, 0);

//initialize depth texture
glGenTextures(1, &depth_buffer);  
glBindTexture(GL_TEXTURE_2D, depth_buffer); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
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_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

//bind both textures to a frame buffer
glGenFramebuffers(1, &frame_buffer); 
glBindFramebuffer(GL_FRAMEBUFFER, frame_buffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color_buffer, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_buffer, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

将场景渲染到帧缓冲区后,我使用以下代码渲染纹理。当使用 color_buffer 时,场景被正确绘制。但是当我使用depth_buffer时,屏幕全是白色的。我不确定这里有什么问题。我的片段着色器只使用 gl_FragColor = texture2D(texture_ID,texture_coord); 来渲染。我的代码有什么问题?如何渲染深度纹理?

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, ***color_buffer***);
glUseProgramObjectARB( program );
glUniform1i(glGetUniformLocation(program,"img"),0);
//codes that attach the texture to a quad

【问题讨论】:

  • “使用颜色缓冲区时”是什么意思?你把它们都放在FBO中。这就是你所说的“使用”它吗?您是否还检查了帧缓冲区的完整性状态?另外,停止使用 ARB_shader_objects。永远不要使用glUseProgramObjectARB;这是一个扩展功能。
  • 当我调用“glBindTexture(GL_TEXTURE_2D, ID);”时如果 ID 是 color_buffer,我可以渲染场景。如果 ID 是 depth_buffer,我得到一个白屏。我预计depth_buffer也可以显示。
  • 我检查了帧缓冲区的完整性,没有返回错误。我应该使用什么来代替 glUseProgramARB?这是一个课堂项目,这个命令在我开始之前就在那里。
  • "我得到了一个白屏。" 很公平。是什么让您认为这不是您的深度缓冲区;)或者,更重要的是,您究竟在渲染什么?您是否尝试线性化从缓冲区获得的深度,使其不在通常的非线性空间中?

标签: opengl textures glsl framebuffer


【解决方案1】:

但是当我使用depth_buffer时,屏幕全是白色的。

我的片段着色器只使用 gl_FragColor = texture2D(texture_ID,texture_coord);进行渲染。

是你的深度缓冲区。如果不了解您实际渲染的内容(或您使用的投影矩阵),就无法确定。但一般来说,透视投影往往是一种非常倾斜的变换。它将 Z 倾斜到更远的值,在 [0, 1] 范围内,因此大多数数字将更接近 1 而不是 0。

如果您想要某种线性空间中的深度值,那么您需要将它们线性化。如果没有剪辑空间 W 相乘,这将有些困难。这是可行的,但您需要透视矩阵中的值才能做到这一点。

【讨论】:

  • 谢谢!我寻找如何线性化深度缓冲区,现在我可以可视化深度缓冲区。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
相关资源
最近更新 更多