【问题标题】:OpenGL depth texture artifactsOpenGL深度纹理伪影
【发布时间】:2012-12-24 14:04:46
【问题描述】:

我正在为我的小 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);

【问题讨论】:

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


    【解决方案1】:

    那么,是什么原因造成的呢?

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

    【讨论】:

    • 谢谢。我想到了这种可能性,但我认为会有另一种解释,因为我没有在游戏或其他应用程序中体验过这些不寻常的工件。我将在其他计算机上测试我的程序,看看问题是否仍然存在。
    • @tiftik:哦,这样的硬件错误可以被很多东西隐藏。例如,如果将纹理更改为深度模板纹理会发生什么?几年前我遇到了一个非常类似的问题,通过使用模板缓冲的 PBuffer 消耗部分视频内存(当时 FBO 不可用),我可以使这个问题消失。但只有添加了模板缓冲区。只是一个常规的 RGB 深度缓冲区 => 那里有问题。
    • 我在另一台也有 Radeon 卡的机器上尝试了这个,看到了非常相似的模式。可能是 Radeon 驱动程序,或者可能是 Radeon 硬件中的错误。如果我不使用 FBO 并将默认深度缓冲区复制到纹理,问题就会消失,尽管这可能会因复制而影响性能。
    • @tiftik:你说Radeon?哪个型号?我在一些未损坏的 Radeon 和某些驱动程序上也看到了类似的模式。如果是这样,这也很可能是驱动程序错误。在任何情况下,如果您只将一个简单的四边形渲染到深度缓冲区中,就不会发生这种情况。
    猜你喜欢
    • 2022-01-21
    • 2020-11-06
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2015-07-12
    • 2018-10-28
    相关资源
    最近更新 更多