iOS GLKit и возврат к фреймбуферу по умолчанию

Я запускаю стандартный код OpenGL, который XCode создает для проекта OpenGL для iOS. Это устанавливает простой ViewController и использует GLKit для выполнения остальной работы.

Все функции обновления/отрисовки приложения реализованы на C++. Это кроссплатформенный.

Идет активное создание фреймбуфера. Фаза отрисовки выполняет рендеринг в несколько буферов кадров, а затем пытается вернуть его к буферу кадров по умолчанию.

glBindFramebuffer(GL_FRAMEBUFFER, 0);

Это генерирует GL_INVALID_ENUM. Только на iOS.

Я совершенно озадачен, почему. Код отлично работает на всех основных платформах, кроме iOS. Я хочу обвинить GLKit. Любые примеры установки iOS OpenGL, которые не используют GLKit?

ОБНОВИТЬ

Следующий фрагмент кода позволяет мне увидеть фреймбуфер по умолчанию, который использует GLKit. Почему-то получается "2". Конечно же, если я использую "2" во всех своих вызовах glBindFrameBuffer, это работает. Это очень расстраивает.

[view bindDrawable ];

GLint defaultFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &defaultFBO);
LOGI("DEFAULT FBO: %d", defaultFBO);  

Какая причина может заставить GLKit не генерировать свой внутренний фреймбуфер в 0? Это семантика, которую используют все другие реализации OpenGL, 0 — это FBO по умолчанию.


person Halsafar    schedule 25.05.2012    source источник


Ответы (3)


В iOS нет фреймбуфера по умолчанию. См. Объекты фреймбуфера являются единственной целью рендеринга в iOS. Я мало что знаю о GLKit, но в iOS для рендеринга чего-либо на экране вам нужно создать фреймбуфер, присоединить к нему рендербуфер и сообщить Core Animation Layer, что этот рендербуфер будет «экраном» или «фреймбуфером по умолчанию» для рисования. к. Значение - все, что вы будете рисовать в этот фреймбуфер, появится на экране. См. Визуализация в основной слой анимации.

person Mārtiņš Možeiko    schedule 26.05.2012
comment
Хорошо, я куплю это как ответ, который я ищу. Итак, GLKit или нет, мне пришлось бы создать FBO и передать этот идентификатор FBO в кодовую базу кросс-платформы, чтобы он знал, что является значением по умолчанию. Я нахожу это странным, поскольку все другие платформы, включая мобильные, управляют FBO для вас и поддерживают семантику, согласно которой 0 является значением по умолчанию. Спасибо! - person Halsafar; 26.05.2012

Я считаю необходимым указать здесь, что вызов glBindFramebuffer(GL_FRAMEBUFFER, 0); не возвращает рендеринг в основной буфер кадра, хотя, похоже, он работает на машинах под управлением Windows, Unix (Mac) или Linux. Настольные компьютеры и ноутбуки не имеют концепции основного системного буфера по умолчанию. Эта идея началась с портативных устройств. Когда вы делаете вызов привязки openGL с нулем в качестве параметра, то вы устанавливаете для этой функции значение NULL. Это то, как вы отключаете эту функцию. То же самое и с glBindTexture(GL_TEXTURE_2D, 0); Возможно, что на некоторых портативных устройствах драйвер автоматически активирует основной системный буфер кадра, когда вы устанавливаете для него значение NULL, не активируя другой. Это будет выбор производителя, и вам не следует на это рассчитывать, это не является частью спецификации openGL ES. Для настольных компьютеров и ноутбуков это абсолютно необходимо, так как для возврата к нормальному рендерингу openGL требуется отключение фреймбуфера.

На устройстве iOS вы должны сделать следующий вызов glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); при условии, что вы назвали свой системный фреймбуфер 'viewFramebuffer'. Найдите в своем коде инициализации следующий вызов: glGenFramebuffers(1, &viewFramebuffer); Что бы вы ни написали в конце, это то, к чему вы привязываетесь при возврате в основной системный буфер.

Если вы используете GLKit, вы можете использовать следующий вызов: [((GLKView *) self.view) bindDrawable]; 'self.view' может немного отличаться в зависимости от вашего конкретного кода запуска.
Кроме того, для iOS вы можете использовать glBindFramebuffer(GL_FRAMEBUFFER, 2); но это, вероятно, не будет одинаковым для будущих устройств, выпущенных Apple. Они могут изменить значение по умолчанию «2» на «3» или что-то еще в будущем, поэтому вы захотите использовать фактическое имя вместо целочисленного значения.

person Marc Clint Dion    schedule 20.05.2013

  • (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {

// вы используете вторичный/закадровый буфер кадра для хранения результата рендеринга

    [self.shader drawOffscreenOnFBO];

//возврат к буферу кадра по умолчанию GLKView

    [((GLKView *) self.view) bindDrawable];

// рисуем на главном экране [self.shader drawinmainscreen];

}

ссылка .....http://districtf13.blogspot.com/

person Beeka5    schedule 07.08.2015