【发布时间】: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? -
这很奇怪。现在,当我缩小窗口时,它会完美调整大小,但当我把它放大时,它看起来像第三张截图,但要大得多。