OpenGL深度纹理工件

时间:2012-12-24 14:04:46

标签: opengl framebuffer render-to-texture depth-buffer shadow-mapping

我正在为我的小3d引擎实现阴影贴图。但是,深度纹理中似乎存在伪影,可以通过使用纹理和观察阴影,或在四边形上绘制深度纹理来看到。

以下是在四边形上绘制时深度纹理的样子:

是的,那些小白色矩形不应该在那里。

那么,可能导致什么呢?

打开glfw窗口:

glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 4);
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 0);
glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwOpenWindow(width, height,
               8, 8, 8, 8,
               24, 0, // 24 = depth buffer bits
               GLFW_WINDOW);

创建深度帧缓冲和纹理:

glGenFramebuffers(1, &depth_framebuffer_);

glGenTextures(1, &depth_texture_);
glBindTexture(GL_TEXTURE_2D, depth_texture_);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 512, 512, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

glBindFramebuffer(GL_FRAMEBUFFER, depth_framebuffer_);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_texture_, 0);

glDrawBuffer(GL_NONE);

if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
  exit(-1);

渲染到深度纹理:

glBindFramebuffer(GL_FRAMEBUFFER, depth_framebuffer_);
glClear(GL_DEPTH_BUFFER_BIT);
render_objects();
glBindFramebuffer(GL_FRAMEBUFFER, 0);

1 个答案:

答案 0 :(得分:1)

  

那么,可能导致什么呢?

对我来说看起来像硬件问题。我有几个“死”的图形卡,由于内存故障,它们表现出类似的模式。可以像打破焊盘一样简单,将显卡放入回流焊炉中几秒钟就可以解决问题。也可能是一个死的GPU内存控制器。