2012-05-25 3 views
1

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

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

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

glBindFramebuffer(GL_FRAMEBUFFER, 0); 

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

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

UPDATE

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

[view bindDrawable ]; 

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

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

ответ

2

В iOS нет фреймбуфера по умолчанию. См. Framebuffer Objects are the Only Rendering Target on iOS. Я не знаю много о GLKit, но в iOS для отображения чего-то на экране вам нужно создать фреймбуфер и приложить к нему renderbuffer, а также сообщить Core Animation Layer, что этот рендерингбуфер будет «экраном» или «фреймбуффом по умолчанию» для рисования к. Значение - все, что вы рисуете для этого фреймбуфера, появится на экране. См. Rendering to a Core Animation Layer.

+0

Хорошо, я куплю, что в качестве ответа я ищу. Так что GLKit или нет, я должен был бы сделать FBO и передать этот идентификатор FBO в кодовую базу кросс-платформы, чтобы он знал, что такое «По умолчанию». Я нахожу это странным, так как все другие платформы, в том числе мобильные, управляют FBO для вас и поддерживают семантику, которая по умолчанию равна 0. Спасибо! – Halsafar

1

Я считаю необходимым указать здесь, что вызов glBindFramebuffer (GL_FRAMEBUFFER, 0); не возвращает рендеринг основному фреймбуферу, хотя он будет работать для машин, работающих под управлением Windows, Unix (Mac) или Linux. На настольных компьютерах и ноутбуках нет понятия основного системного буфера по умолчанию. Эта идея началась с карманных устройств. Когда вы создаете вызов bind 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» или что-то еще в будущем, поэтому вы хотите использовать фактическое имя вместо целочисленного значения.

0
  • (пустоты) glkView: (GLKView *) вид drawInRect: (CGRect) прямоугольник {

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

[self.shader drawOffscreenOnFBO]; 

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

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

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

}

Эталонное ..... http://districtf13.blogspot.com/

 Смежные вопросы

  • Нет связанных вопросов^_^