我正在通过渲染传递到FrameBufferObject上,这样我就可以在下一个渲染传递中将结果用作纹理。看教程,我需要打电话给:

glBindFramebuffer(GL_TEXTURE2D, mFrameBufferObjectID);
glViewport(0, 0, mWidth, mHeight);

其中,mWidth和mHeight是帧缓冲区对象的宽度和高度。似乎没有glViewport调用,就无法正确绘制任何内容。奇怪的是,在开始下一帧时,我需要调用:
glViewport(0, 0, window_width, window_height);

这样我就可以回到以前的窗口宽度/高度;但是调用它似乎只能将我的内容渲染为原始窗口大小的一半。因此,我实际上只看到四分之一的屏幕被渲染了东西(是的,整个场景都在上面)。我尝试放置一个断点,然后查看宽度和高度值,它们是原始值(1024、640)。为什么会这样呢?我尝试将它们加倍,它可以正确地绘制在我的整个窗口上。

我正在Mac上通过xcode进行此操作。

最佳答案

如果您使用以下方式启用了剪刀测试,请尝试调整剪刀盒以及视口(viewport)

glEnable(GL_SCISSOR_TEST);

要解决您的问题,请写
glViewport(0, 0, mWidth, mHeight);
glScissor(0, 0, mWidth, mHeight);


glViewport(0, 0, window_width, window_height);
glScissor(0, 0, window_width, window_height);

每次切换到新的帧缓冲区时,其大小都与前一个不同,或者总是为了安全起见。

参见引用glScissor的此链接
或这另一篇文章解释了它的用途https://gamedev.stackexchange.com/questions/40704/what-is-the-purpose-of-glscissor

关于c++ - OpenGL FrameBuffer和glViewport,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40337509/

10-10 18:23