我正在对 FrameBufferObject 进行渲染传递,这样我就可以在下一个渲染传递中将结果用作纹理。查看教程,我需要调用:
glBindFramebuffer(GL_TEXTURE2D, mFrameBufferObjectID);
glViewport(0, 0, mWidth, mHeight);
其中 mWidth 和 mHeight 是帧缓冲区对象的宽度和高度。似乎没有这个 glViewport 调用,没有任何东西被正确绘制。奇怪的是,在开始下一帧时,我需要调用:
glViewport(0, 0, window_width, window_height);
这样我就可以回到我以前的窗口宽度/高度;但调用它似乎只会以原始窗口大小的一半呈现我的东西。所以我实际上只看到我屏幕的四分之一被渲染到(是的,整个场景都在上面)。我尝试放置一个断点并查看 width 和 heigh 值,它们是原始值 (1024, 640)。为什么会这样?我尝试将它们加倍,它正确地绘制在我的整个窗口上。
我在 Mac 上通过 xcode 和 glew 执行此操作。
最佳答案
视口(viewport)设置存储在全局状态中。因此,如果您更改它,它会保持新值,直到您再次调用 glViewport
。正如您已经指出的那样,只要您想要渲染到与之前绑定(bind)的大小不同的 FBO(或后备缓冲区),就必须设置大小。
关于c++ - OpenGL FrameBuffer 和 glViewport,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40337509/