gpt4 book ai didi

c++ - 如何在不调用 glDeleteVertexArrays 的情况下删除 OpenGL 顶点数组对象?

转载 作者:行者123 更新时间:2023-11-28 06:32:49 24 4
gpt4 key购买 nike

我正在开发一个 After Effects 插件,我在其中使用 VAO 进行 OpenGL 渲染。在全屏 RAM 预览后,句柄号为 1 的 VAO 以某种方式被删除(glGenVertexArrays 再次生成 1)。奇怪的是着色器和帧缓冲区仍然有效,所以不是整个 OpenGL 上下文都被重置了。有谁知道是什么原因造成的?

最佳答案

最可能的解释是,您的插件每次都会获得一个全新创建的 OpenGL 上下文。如果您的 OpenGL 上下文与另一个“缓存”上下文共享其“列表”命名空间,并且为新上下文重新建立此共享,您会观察到此行为。

The strange thing is that the shaders and framebuffers are still valid, so it's not the entire OpenGL context that gets reset.

当建立 OpenGL 上下文命名空间共享时,某些类型的对象是共享的,即为每个参与的上下文增加它们的“内部引用计数”(您不能直接访问 thise),而其他则不是。以任何形式保存数据的对象(纹理、缓冲区对象、着色器)是共享的,而保存状态的抽象对象(其中的数组对象和帧缓冲区对象)则不是。

因此,如果创建了一个新上下文并建立了与缓存上下文共享的命名空间,您将看到您之前创建的所有纹理、着色器等,而 VAO 和 FBO 将消失。

如果您想捕获这种情况,请使用 wglGetCurrentContext 获取操作系统句柄。您可以安全地将 Windows 句柄转换为 uintptr_t 整数类型,因此为了进行调试,您可以打印句柄的值并查看它是否发生变化。

关于c++ - 如何在不调用 glDeleteVertexArrays 的情况下删除 OpenGL 顶点数组对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27231519/

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