我正在开发一个After Effects插件,我使用VAO进行OpenGL渲染。在全屏RAM预览之后,具有句柄号1的VAO以某种方式被删除(glGenVertexArrays再次生成1)。奇怪的是着色器和帧缓冲区仍然有效,因此不是整个OpenGL上下文被重置。有谁知道是什么原因引起的?
答案 0 :(得分:1)
最可能的解释是,您的插件会在一切时间内获得全新创建的OpenGL上下文。如果您的OpenGL上下文共享其"列表"命名空间与另一个"缓存"上下文,并且为新环境重新建立此共享,您将观察到此行为。
奇怪的是着色器和帧缓冲区仍然有效,因此不会重置整个OpenGL上下文。
在建立OpenGL上下文命名空间共享时,会共享某些类型的对象,即获取其内部引用计数" (你不能直接访问你)为每个参与的上下文递增,而其他人不是。以任何形式(纹理,缓冲对象,着色器)保存数据的对象是共享的,而保存状态的抽象对象(其中包含数组对象和帧缓冲对象)则不是。
因此,如果创建了新的上下文并且建立了与缓存上下文共享的命名空间,您将看到之前创建的所有纹理,着色器等,而VAO和FBO将消失。
如果您想捕获这种情况,请使用wglGetCurrentContext
来获取操作系统句柄。您可以安全地将窗口句柄转换为uintptr_t
整数类型,因此,为了进行调试,您可以打印句柄的值并查找它是否更改。