Я разрабатываю плагин After Effects, где я использую VAO для рендеринга OpenGL. После предварительного просмотра в полноэкранном режиме VAO, который имеет дескриптор номер 1, каким-то образом удаляется (glGenVertexArrays генерирует 1 снова). Странная вещь заключается в том, что шейдеры и фреймбуферы по-прежнему действительны, поэтому не полностью сменится весь контекст OpenGL. Кто-нибудь знает, что может вызвать это?
Хорошо, поэтому проблема заключалась в использовании GLFW для получения контекста OpenGL. Как только я переключился на WGL, он сработал.
Наиболее вероятным объяснением является то, что ваш плагин получает полностью новый созданный контекст OpenGL, все время происходит. Если ваш контекст OpenGL поделился своим пространством имен "списком" с другим "кеширующим" контекстом, и этот обмен будет восстановлен для нового контекста, вы должны наблюдать это поведение.
Странная вещь заключается в том, что шейдеры и фреймбуферы по-прежнему действительны, поэтому не полностью сменится весь контекст OpenGL.
При создании пространства имен OpenGL-контекстов, разделяющего некоторые виды объектов, совместно используются, т.е. Получают свои "внутренние подсчеты ссылок" (вы не можете напрямую обращаться к нему), увеличивающихся для каждого участвующего контекста, а другие - нет. Объекты, которые хранят данные в любой форме (текстуры, буферные объекты, шейдеры), являются общими, в то время как объекты абстракции, которые содержат состояние (объекты массива и объекты фреймбуфера среди них), не являются.
Поэтому, если создается новый контекст и используется пространство имен с установленным контентом кэша, вы увидите все текстуры, шейдеры и т.д., Которые вы создали ранее, тогда как VAO и FBOs исчезнут.
Если вы хотите поймать эту ситуацию, используйте wglGetCurrentContext
чтобы получить дескриптор ОС. Вы можете безопасно uintptr_t
дескриптор окна к uintptr_t
integer, поэтому для отладки вы можете распечатать значение дескриптора и искать, если он изменится.