Я пытаюсь отладить этот цикл рендеринга, который я не писал. Где-то есть ошибка, из-за которой программа падает, но glGetError()
, похоже, ведет себя забавно.
Это на iOS, и я использую GLKViewController
, GLKView
и EAGLContext
для рисования.
Обобщенная версия цикла рендеринга выглядит примерно так:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
// At this point, GLKView's EAGLContext should be the active context
checkGlGetError();
if (!isTextureInit || geometryChanged)
{
setupRenderTextureAndRenderbuffer();
}
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_originalFramebufferId);
glBindFramebuffer(GL_FRAMEBUFFER, _framebufferId);
// a. Some complex operations
// b. Some rendering on the texture framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, _originalFramebufferId);
// c. Some additional complex operations
// d. Render the texture on screen
checkGlGetError();
}
Это приводит к сбою приложения. Проблема в том, что последний checkGlGetError()
вызов первого отрендеренного кадра не выдает никакой ошибки (и ничего не отображается на экране).
Первый вызов checkGlGetError()
второго визуализированного кадра дает загадочное GL_INVALID_ENUM
, и вскоре после этого приложение аварийно завершает работу.
Если я заменю свой цикл рендеринга на это:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
checkGlGetError();
// a. Some complex operations
// b. Some rendering on the screen
checkGlGetError();
}
Все работает, ошибок не выдает. Но: почему glGetError()
не перехватывает ошибку сразу после ошибочного вызова OpenGL? Почему он сообщает об этом только в начале следующего кадра?
Код с ошибкой довольно длинный, и без дополнительных указаний, где именно ошибка, отлаживать его довольно сложно.
ОБНОВИТЬ
Я загрузил весь код здесь. Это незавершенный порт Google CardboardSDK (decompiled) с Java на Objective-C++, который я пытаюсь выполнить.
Основной цикл рендеринга находится в классе CardboardViewController
. Команда OpenGL, вызывающая сбой, должна относиться к классу DistortionRenderer
(функция которого состоит в том, чтобы брать простые стереоскопические окна просмотра и отображать их на текстуре, чтобы применить искажение объектива к каждому).
Если вы установите distortionCorrectionEnabled
CardboardViewController
на NO
, сбой исчезнет.