OpenGL FrameBuffer and glViewport
OpenGL FrameBuffer and glViewport
我正在通过一个渲染传递到一个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
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- 保证逻辑 AND 表达式中的函数调用
- python ctypes and C++ pointers
- C++ const char with .begin() and .end()
- Threads with Classes and std::packaged_task
- OpenGL FrameBuffer and glViewport