c++ - OpenGL FrameBuffer 和 glViewport

标签 c++ opengl fbo

我正在对 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/

相关文章:

c++ - dynamic_pointer_cast 的模板参数

c++ - 设置优化时未使用的变量警告

c++ - 二十一点算法

opengl - 通过 FBO 使用“渲染到目标”时是否需要重新生成 MipMap?

opengl - 深度组件的 Cuda 渲染缓冲区互操作

c++ - 为什么这段代码会使 VC++ 编译器崩溃?

c++ - 在 C++ 中使用 SOIL 在屏幕中加载图片不起作用

c++ - GLM乘法顺序

opengl - opengl map 应用程序中的标签

java - Opengl - 后处理多个 FBO - 我做错了什么?