OpenGL FrameBuffer and glViewport

OpenGL FrameBuffer and glViewport

本文关键字:glViewport and FrameBuffer OpenGL      更新时间:2023-10-16

我正在通过一个渲染传递到一个FrameBufferObject上,这样我就可以在下一个渲染传递中使用这个结果作为纹理。查看教程,我需要调用:

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

,其中mWidth和mHeight是帧缓冲对象的宽度和高度。似乎没有这个glViewport调用,没有任何东西被正确绘制。奇怪的是,在开始下一帧时,我需要调用:

glViewport(0, 0, window_width, window_height);

这样我就可以回到我之前设置的窗口宽度/高度;但调用它似乎只渲染我的东西在原来的窗口大小的一半。所以我只能看到四分之一的屏幕被渲染(是的,整个场景都在上面)。我试着设置一个断点并查看宽度和高度值,它们是原始值(1024,640)。为什么会发生这种情况?我试着将它们加倍,它正确地绘制了整个窗口。

我在Mac上通过xcode和glow来做这个

视口设置存储在全局状态中。所以如果你改变它,它会保持在新的值直到你再次调用glViewport。正如你已经注意到的,当你想要渲染到一个与之前绑定的大小不同的FBO(或backbuffer)时,你必须设置大小。

如果您使用

启用了剪刀测试,则尝试调整剪刀框以及视口。
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