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

0

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

  • 1
    AFAIK, нет другого способа освободить VAO, кроме как уничтожить его (за исключением, может быть, ошибки нехватки памяти или чего-то подобного). Скорее всего, какой-то фрагмент кода освобождает его преждевременно, но, не видя код, мы не можем помочь.
  • 0
    Странно, но я также проверил это с помощью образца плагина OpenGL, включенного в SDK After Effects, просто вызвав glGenVertexArrays для каждого визуализированного кадра. Сгенерированный дескриптор увеличивается каждый кадр, пока я не отменю предварительный просмотр ОЗУ в полноэкранном режиме, где он снова начинается с 1. Я определенно нигде не вызываю glDeleteVertexArrays, поэтому любое удаление vao должно происходить вне моего кода ...
Показать ещё 5 комментариев
Теги:
opengl
visual-studio-2012
after-effects
vertex-array-object

2 ответа

-2
Лучший ответ

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

1

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню