Сбой glClear с GL_FRAMEBUFFER_UNDEFINED - PullRequest
1 голос
/ 03 апреля 2012

Я обновляю OpenGL / Qt до OSX Lion и у меня появляются новые ошибки, которые мне нужно решить. Я получаю GL_FRAMEBUFFER_UNDEFINED на GLClear необъяснимым образом.

Я прочитал все возможные причины этого, и, похоже, ничего не совпадает. Чтобы помочь отследить проблему, я добавил следующие две строки в общий проверочный код, который мы используем:

glCheckFramebufferStatus(GL_FRAMEBUFFER);
glCheckFramebufferStatusEXT(GL_FRAMEBUFFER);

Вот OpenGL Trace, сначала начало приложения:

1: 0x01021b06 glGenBuffers(1, 0x11c461c0); 
2: 0x01021b06 glGenBuffers(1, 0x11c4616c);  
3: 0x01021b06 glGenBuffers(1, 0x11c46118); 
4: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
5: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
6: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
7: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
8: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
9: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
10: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
11: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED

Как вы можете видеть, ОБА вызовы заканчиваются как glCheckFramebufferStatusEXT, что, как я полагаю, является чем-то, что делает OSX. Я не уверен, почему нет никакого фреймбуфера, хотя когда-либо.

Теперь, вот след во время ошибки:

29842: 0x01021b06 glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_ONE); 
29843: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29844: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29845: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
29846: 0x01021b06 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 32, 32, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, 0x11c3d010); 
29847: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29848: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29849: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
29850: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29851: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29852: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
29853: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
29854: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29855: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29856: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
29857: 0x01021b06 glClearColor(0, 0, 0, 1); 
29858: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
29859: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29860: 0x01021b06 glClear(GL_COLOR_BUFFER_BIT); 
29861: 0x01021b06 glGetError(); returns: GL_INVALID_FRAMEBUFFER_OPERATION

Как видите, мы получаем GL_NO_ERROR, вплоть до GlClear, который не работает.

Я не уверен, как решить эту проблему - какую информацию я должен собрать, чтобы решить ее?

Ответы [ 4 ]

3 голосов
/ 28 августа 2013

Я также видел эту ошибку при использовании NSOpenGLView в OS X 10.8, но я нашел обходной путь.Если ваш glCheckFrameBufferStatus возвращает GL_FRAMEBUFFER_UNDEFINED, это означает, что буфер кадра не создан.Убедитесь, что вы вызываете [[self openGLContext] setView: self], чтобы убедиться, что с контекстом связана нарисованная область.

Мое обнаружение состояло в том, что если любой из предков NSOpenGLView либо (1) иметь слои (т. Е. Слой подкреплен или слой размещен через setWantsLayer) или (2) инициализирован с помощью Interface Builder, тогда кадровый буфер NSOpenGLView не будет инициализирован!Мне пришлось изменить мой OpenGLView и его предков так, чтобы они не использовали слои и не выделялись компоновщиком интерфейса для того, чтобы мой программно созданный экземпляр NSOpenGLView работал.(Под программным созданием я имею в виду, что openGLView был создан с использованием [[NSOpenGLVIew alloc] init ..].)

2 голосов
/ 19 ноября 2012

Ты абсолютно прав. Apple glFullScreen получает glGetError сразу после glClear. Происходит один раз при запуске и снова переключается с оконного на полный экран.

1 голос
/ 11 апреля 2013

Похоже, это вызвано проблемой с реализацией GL, поставляемой с Mac OS X. Очевидно, кадровый буфер не готов к использованию во время вызова glClear.

http://lists.apple.com/archives/mac-opengl/2012/Jul/msg00038.html

Это было зарегистрировано как ошибка на яблочном трекере, радар # 11974524.

Я обнаружил, что все работает правильно, если вы вызываете glGetError () один раз после glClear, это сбрасывает флаг ошибки OpenGL.

0 голосов
/ 20 мая 2012

Я столкнулся с той же проблемой здесь. После игры с собственным примером приложения GLFullscreen от Apple, я заметил, что ошибка проявляется только при использовании Mac OSX SDK 10.7, если я переключаюсь на 10.6, она волшебным образом исчезает.

Вы можете найти GLFullscreen здесь .

Вероятно, вам нужно настроить буфер кадров в 10.7 другим способом. Я мог бы исследовать это, если обнаружу, что использование 10.6 каким-то образом ограничивает меня. До тех пор я совершенно рад игнорировать эту проблему.

...