Как можно удалить объект Vertex Array OpenGL без вызова glDeleteVertexArrays?

Я разрабатываю плагин After Effects, в котором я использую VAO для рендеринга OpenGL. После полноэкранного предварительного просмотра ОЗУ VAO, имеющий дескриптор номер 1, каким-то образом удаляется (glGenVertexArrays генерирует 1 снова). Странно то, что шейдеры и кадровые буферы все еще действуют, поэтому не весь контекст OpenGL сбрасывается. Кто-нибудь знает, что может быть причиной этого?

0

Решение

Наиболее вероятным объяснением является то, что ваш плагин получает полностью новый контекст OpenGL каждый раз, когда происходит. Если ваш контекст OpenGL поделился своим пространством имен «список» с другим контекстом «кэширования», и этот общий доступ восстановлен для нового контекста, вы бы наблюдали это поведение.

Странно то, что шейдеры и кадровые буферы все еще действуют, поэтому не весь контекст OpenGL сбрасывается.

При установлении совместного использования пространства имен контекста OpenGL некоторые виды объектов совместно используются, то есть увеличивают их «внутренние счетчики ссылок» (вы не можете напрямую обращаться к ним) для каждого участвующего контекста, а другие нет. Объекты, которые хранят данные в любой форме (текстуры, буферные объекты, шейдеры), являются общими, в то время как объекты абстракции, которые хранят состояние (среди них объекты массива и объекты кадрового буфера), — нет.

Таким образом, если будет создан новый контекст и будет создан общий доступ к пространству имен с контекстом кэша, вы увидите все текстуры, шейдеры и т. Д., Которые вы создали ранее, а VAO и FBO исчезнут.

Если вы хотите поймать эту ситуацию, используйте wglGetCurrentContext чтобы получить дескриптор ОС. Вы можете смело ставить ручку окна на uintptr_t целочисленный тип, поэтому для отладки вы можете вывести значение дескриптора и посмотреть, не изменится ли оно.

1

Другие решения

Итак, проблема заключалась в использовании GLFW для получения контекста OpenGL. Как только я переключился на WGL, это сработало.

-2