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