【问题标题】:Framebuffer quad problem on window resize窗口调整大小的帧缓冲区四边形问题
【发布时间】:2022-01-18 21:55:06
【问题描述】:

我在 learnOpenGL 网站上关注有关在默认分辨率下正常工作的帧缓冲区的教程。

但是,每当我调整窗口大小时,帧缓冲区四边形就会严重偏移。例如,如果我将窗口扩大得更大,则帧缓冲区看起来会放大,如果我缩小窗口,则顶部和右侧会出现间隙。这是一个屏幕截图,其中 1 为默认窗口,2 为拉伸大,3 为调整大小后缩小:

我确实读到我必须再次调用 glViewport,但我到底应该在哪里调用它?这是我一直在使用的帧缓冲回调:

void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}

我在 main 中创建帧缓冲区:

// configure framebuffer here //
unsigned int hdrFBO;
glGenFramebuffers(1, &hdrFBO);
glBindFramebuffer(GL_FRAMEBUFFER, hdrFBO);
// create color attachment texture buffer
unsigned int colorBuffer;
glGenTextures(1, &colorBuffer);
glBindTexture(GL_TEXTURE_2D, colorBuffer);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBuffer, 0);
    
// create depth buffer (renderbuffer) 
unsigned int rboDepth;
glViewport(0, 0, width, height);
glGenRenderbuffers(1, &rboDepth);
glBindRenderbuffer(GL_RENDERBUFFER, rboDepth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboDepth);
// check status
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    std::cout << "Framebuffer not complete!" << std::endl;
glBindFramebuffer(GL_FRAMEBUFFER, 0);

有没有简单的方法来解决这个问题?

小更新,有人告诉我添加 glTexImage2D,我在我的 framebuffer_size_callback 函数中添加了它:

void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);

}

现在,当我将其调整为更小时,它会正确调整大小,但是在使窗口变大时,它似乎会被切断,现在出现黑色间隙?

【问题讨论】:

  • IIRC 你必须在调整大小时调用glTexImage2D 来调整帧缓冲区的支持纹理大小。
  • @van dench,你的意思是我必须在帧缓冲回调中再次调用glTexImage2D
  • 这很奇怪。现在,当我缩小窗口时,它会完美调整大小,但当我把它放大时,它看起来像第三张截图,但要大得多。

标签: c++ opengl glm-math


【解决方案1】:

如果有人感兴趣,@van dench 帮助解决了一半的问题。较大的调整大小不起作用的原因是因为需要更新深度附件以及初始颜色附件。

两者都是必需的,您不能忽略其中一个。所以在我的framebuffer_size_callback 中,这就是我添加的内容,现在帧缓冲区会根据任何调整大小进行调整,这是一个需要解决的脑残问题。

void framebuffer_size_callback(...)
{
  // color buffer attachment here
  glTexImage2D(...);
  // and depth buffer attachment
  glRenderBuffer(...);
}

这个问题已经解决了,谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2011-09-26
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多