2013-09-24 5 views
0

На данный момент я использую моментальный снимок, чтобы сделать свой выбор. Я меняю код рендеринга, чтобы отобразить объекты ids, захватить снимок, а затем взять значение для пикселя под пользователем. Я думаю, что это довольно неэффективно, хотя - и я получаю сообщения о медлительности на некоторых ipads (мой мини отлично).код выбора для opengl-es на ios

Можно ли визуализировать бэкбуффер и использовать вызов glreadpixels для извлечения только пикселя под нажатием кнопки без отображения объектов на экран? Я использую GLKView для моего рендеринга. Я пробовал glreadpixels с моим текущим кодом - и он всегда кажется черным. Я знаю, что в документации для GLKView рекомендуется использовать только моментальный снимок, но, безусловно, более эффективно собирать только один пиксель.

ответ

1

Вы правы, гораздо лучший способ - визуализировать идентификаторы объектов в обратном буфере и считывать определенный пиксель (или блок пикселей).

(Если вы делаете много выбора, вы можете даже использовать второй закадровый renderbuffer и генерировать идентификаторы объектов для каждого кадра в один проход рендеринга.)

Но вам придется написать свой собственный взгляд код для выделения внеэкранных буферов рендеринга, буферов глубины и еще много чего. GLKView - это класс удобства, высокоуровневая оболочка, и Apple doco специально говорит, что не путается с основной реализацией.

Настройка собственных буферов визуализации GL не слишком сложна, и здесь есть пример кода. Я использовал пример кода на сайте Apple dev и OpenGL SuperBible.

+0

Я пытаюсь сделать это, выделив внеэкранный объект фреймбуфера, но все еще имея проблемы с получением glreadpixels для работы. вот новый вопрос по этому вопросу: http://stackoverflow.com/questions/19006791/framebuffer-object-rendering-onios –

0

На самом деле вполне возможно читать из буфера, даже используя GLKView. В документации указано, что это не рекомендуется - но после небольшого ворчания я получил его на работу. Единственное, что было проблемой, это то, что glreadpixels может принимать GL_RGBA в качестве аргумента (а не GL_RGB). Пока вы гарантируете, что glClear вызывается после выбора, вы не получите объектных идентификаторов, отображаемых на экране.

Использование моментального снимка для выбора на ipad mini замедлило действие приложения на 50%. Использование glReadPixels приводит к отсутствию заметного замедления. Вы можете сделать это, выделив дополнительный фреймбуфер, но я не думаю, что это необходимо.

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