Получение идентификатора буфера кадра по умолчанию из GLKView / GLKit - PullRequest
14 голосов
/ 17 марта 2012

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

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

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

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

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

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

Ответы [ 3 ]

23 голосов
/ 18 марта 2012

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

GLint defaultFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &defaultFBO);
0 голосов
/ 03 декабря 2016

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...