Подтвердить что ты не робот

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

Я использую GLkit/GLKView в моем проекте OpenGL ES 2.0 для IOS для управления стандартным FBO/жизненным циклом моего приложения.

В настольном OpenGL, чтобы связать FBO (передний буфер), я могу просто вызвать glBindFrameBuffer (GL_FRAMEBUFFER, 0), но это не так в приложении IOS, поскольку вы должны сами создать FBO по умолчанию, и он будет иметь уникальный идентификатор;

Проблема в стиле кодирования GLKit/GLKView заставляет меня использовать функцию GLKView "bindDrawable" для активации FBO по умолчанию, что делает дизайн моей системы рендеринга кросс-платформы немного уродливым (нужно хранить указатель GLKView как void * в моем движке С++ класс и мост прикладывают его каждый раз, когда я хочу выполнить привязку FBO по умолчанию)

Есть ли способ получить идентификатор FBO по умолчанию, который GLKit/GLKView создает, чтобы я мог хранить и использовать его для привязки буфера кадров по умолчанию где-нибудь в моем коде?

В худшем случае я могу вернуться назад, чтобы создать сам FBO по умолчанию и раскрыть GLKit/GLKView, но это такая хорошая структура, что я бы хотел продолжить ее использовать.

Извините за мой плохой английский и заранее заблаговременно за любой ответ.

4b9b3361

Ответ 1

Возможно, вы можете получить "текущий" идентификатор фреймбуфера сразу после вызова bindDrawable, вызвав что-то вроде:

GLint defaultFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &defaultFBO);

Ответ 2

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

Ответ 3

Правильный способ привязки фреймбуфера по умолчанию в GLKit состоит в вызове метода bindDrawable на GLKview.

[self bindDrawable] или [myglkview bindDrawable] в зависимости от контекста.