gpt4 book ai didi

c++ - OpenGL:VBO删除的奇怪行为?

转载 作者:太空宇宙 更新时间:2023-11-04 13:32:21 24 4
gpt4 key购买 nike

我在顶点缓冲区对象 (VBO) 中遇到了一个奇怪的问题。我创建了一个包含 VBO 创建和删除的类。我在类的析构函数中删除了所有 VBO(使用 glDeleteBuffers())。

现在我创建了 2 个 OpenGL 上下文窗口,每个窗口都使用 VBO 类运行。现在,当我关闭一个 GLwindow 时,它的析构函数调用和 VBO 也被删除,但奇怪的是这个析构函数对第二个窗口的影响,在第二个窗口上运行的对象消失了。当我使用已弃用的 glVertex3fv 进行渲染时,我可以看到该对象,但不能使用 VBO。如果我不使用 GLwindow 类的析构函数删除 VBO,一切正常。我不应该在每次删除上下文时删除 VBO 吗?

我的问题是为什么会这样?我知道 OpenGL 是一个状态机,但我们不能创建一个全新的独立类对象吗?

我注意到与 (glDeleteTextures()) 的效果相同,如果我不使用析构函数删除纹理,不会发生任何奇怪的事情,但如果我删除一个 Glwindows 纹理,它会影响第二个 Glwindow 渲染并且纹理消失。

这是已知问题还是只发生在我身上?

最佳答案

Reto Koradi 已经提到了复制语义。另一件要记住的事情是 OpenGL 允许上下文共享,即一些对象在 OpenGL 上下文之间共享,在一个上下文中删除会从所有上下文中删除它。超越共享上下文的对象是

  • 纹理
  • 使用 glBindBuffer 绑定(bind)的缓冲对象
  • 渲染缓冲区

超越共享上下文的对象是

  • 帧缓冲对象
  • 顶点数组对象

关于c++ - OpenGL:VBO删除的奇怪行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30948191/

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