gpt4 book ai didi

c++ - 存储 OpenGL 状态

转载 作者:搜寻专家 更新时间:2023-10-31 00:36:21 26 4
gpt4 key购买 nike

假设我正在尝试在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com