0

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

+1

AFAIK нет возможности освободить VAO, кроме как уничтожить его (за исключением, возможно, во время ошибки из-за памяти или чего-то подобного). Скорее всего, часть кода освобождает его преждевременно, но, не видя кода, мы не можем много помочь. –

+0

Странно я также тестировал это с помощью плагина с образцом OpenGL, включенного в SDK After Effects, просто вызывая glGenVertexArrays для каждого визуализированного фрейма. Сгенерированная ручка увеличивает каждый кадр до тех пор, пока я не отменит просмотр в полноэкранном режиме RAM, где он снова начнется с 1. Я определенно не называю glDeleteVertexArrays нигде, поэтому любое удаление vao должно произойти за пределами моего кода ... –

+2

Похоже, что вы работаете в другом контексте OpenGL во второй раз, когда вы вызываете 'glGenVertexArrays (...)'. VAO не разделяются между контекстами визуализации, в то время как другие объекты (те, которые хранят фактические данные), такие как текстуры и объекты буфера, могут совместно использоваться. –

ответ

-2

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

1

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

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

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

Итак, если создается новый контекст и используется пространство имен с установленным контуром кэша, вы увидите все текстуры, шейдеры и т. Д., Созданные ранее, в то время как VAO и FBOs исчезнут.

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

 Смежные вопросы

  • Нет связанных вопросов^_^