c++ - 存储 OpenGL 状态

标签 c++ opengl

假设我正在尝试在 C++ 上制作某种小型 opengl 图形引擎。我读到通过 glGet* 函数访问 opengl 状态可能非常昂贵(而访问 opengl 状态似乎是一个经常操作),强烈建议在某个地方快速存储 opengl 状态的拷贝读/写访问权限。

我目前正在考虑将 opengl 状态存储为某种适当类型的全局 thread_local 变量。这个设计有多糟糕?有没有什么陷阱?

最佳答案

如果你想坚持使用 OpenGL 的设计(其中你的上下文指针可以被认为是“thread_local”),我想这是一个有效的选项......显然,你需要完全控制所有 OpenGL 调用才能保持你的状态复制与当前上下文的状态同步。

我个人更喜欢使用“OpenGLState”类来包装感兴趣的 OpenGL 状态,其中包含一堆可设置/可获取的属性,每个属性都映射到状态的某些部分。这样您还可以避免两次设置相同的状态。您可以将其设置为 thread_local,但我不能(Visual C++ 仅支持 POD 类型的 thread_local)。

您需要非常小心,因为某些 OpenGL 调用会间接更改上下文状态中看似不相关的部分。例如,glDeleteTextures 会将已删除纹理的任何绑定(bind)重置为 0。此外,某些工具包对于在背后更改 OpenGL 状态非常“有用”(例如,OSX 上的 QtOpenGLContext 在设为当前时会为您更改视口(viewport)) .

关于c++ - 存储 OpenGL 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22094960/

相关文章:

对象的 C++ vector 与指向对象的指针 vector

c# - glframebuffertexture 和 glbindtexture 之间的区别

c++ - QT Creator Main.cpp 主窗口.cpp

c++ - 可以使用 memset 来填充一组 std::complex<float> 吗?

SIG_ERR 上的 C++ 旧式转换警告

opengl - 损坏的 GLSL Spinlock/GLSL Locks Compendium

OpenGL 可编程管线点光源

c++ - 序列容器的重新分级删除功能

c - OpenGL中struct移动他的内存地址

c++ - Opengl视频纹理