假设我正在尝试用 C++ 制作某种小型 opengl 图形引擎。我读过通过访问 opengl 状态glGet*
函数可能非常昂贵(虽然访问 opengl 状态似乎是一个经常操作),并且强烈建议将 opengl 状态的副本存储在具有快速读/写访问权限的地方。
我目前正在考虑将 opengl 状态存储为某种适当类型的全局 thread_local 变量。这个设计有多糟糕?有什么陷阱吗?
如果你想坚持 OpenGL 的设计(其中你的上下文指针可以被认为是“thread_local”),我想这是一个有效的选项......显然,你需要完全控制所有 OpenGL 调用,以便将你的状态副本保留在与当前上下文的状态同步。
我个人更喜欢使用“OpenGLState”类来包装感兴趣的 OpenGL 状态,其中包含一堆可设置/可获取的属性,每个属性都映射到状态的某些部分。这样您还可以避免两次设置相同的状态。您可以将其设置为 thread_local,但我不能(Visual C++ 仅支持 POD 类型的 thread_local)。
您需要非常小心,因为某些 OpenGL 调用会间接更改上下文状态中看似不相关的部分。例如,glDeleteTextures 会将已删除纹理的任何绑定重置为 0。此外,某些工具包对于在背后更改 OpenGL 状态非常“有用”(例如,OSX 上的 QtOpenGLContext 在设为当前时会为您更改视口) 。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)