Android OpenGLES рендеринга в текстуру - PullRequest
6 голосов
/ 11 ноября 2009

Я пишу графические приложения для iPhone и собираюсь перенести последнее приложение «Слои» на платформу Android. Layers - это приложение для рисования, которое позволяет пользователям рисовать на экране и создавать многослойные рисунки с различными кистями, цветами и т. Д. И экспортировать в PSD. У него есть синхронизация с рабочим столом, инструмент для смазывания, много хороших вещей ... http://www.layersforiphone.com/

Я начал изучать платформу Android в понедельник и столкнулся с серьезной проблемой. Я использую OpenGL для рисования, потому что он предлагает лучшую производительность. Однако есть несколько мест, где мне нужно визуализировать текстуру, а затем использовать текстуру. Например:

  1. Используйте текстуру кисти и линию спрайтов, чтобы создать черную мазку в текстуре A
  2. Поместите кисть color + alpha в glColor4f и затем нарисуйте текстуру A на экране.

На iPhone я делаю это постоянно, когда палец пользователя движется, и я могу достигать 12-15 кадров в секунду на iPod Touch 1-го поколения. Это необходимо, потому что применение цвета и альфа-канала к отдельным спрайтам, составляющим мазок кисти, не дает правильного результата (поскольку спрайты перекрывают друг друга и делают штрих слишком темным).

Платформа Android поддерживает OpenGL ES 1.0, но, похоже, не использует ключевые функции для работы с кадровыми буферами. Я не могу найти способ привязать текстуру к кадровому буферу и нарисовать ее с помощью OpenGL.

Вот как я обычно это делаю на iPhone:

// generate a secondary framebuffer and bind it to OpenGL so we don't mess with existing output.
glGenFramebuffers(1, &compositingFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, compositingFramebuffer);

// attach a texture to the framebuffer.
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

// subsequent drawing operations are rendered into the texture

// restore the primary framebuffer and (possibly) draw the rendered texture
glBindFramebuffer(GL_FRAMEBUFFER, originalActiveFramebuffer);

Есть ли что-нибудь подобное на платформе Android? На iPhone OpenGL значительно быстрее, чем программный рисунок и является единственным жизнеспособным решением (поверьте мне - я тоже написал приложение для рисования CoreGraphics ...). Может быть, есть другой маршрут, который я мог бы выбрать на Android? Я готов прыгать через любые необходимые обручи, но я не буду публиковать приложение, если производительность не будет хорошая (10 кадров в секунду + при рисовании на экране).

1 Ответ

7 голосов
/ 11 ноября 2009

Я скептически отношусь к тому, что все устройства Android будут поддерживать один и тот же набор расширений OpenGL ES, или что все они будут поддерживать одну и ту же версию OpenGL ES.

Объекты Framebuffer (FBO) являются частью базовой спецификации OpenGL ES 2.0; Если ваше устройство Android поддерживает ES 2.0, значит, оно поддерживает FBO.

Если ваше Android-устройство поддерживает ES 1.1, проверьте строку расширения для GL_OES_framebuffer_object , используя glGetString (GL_EXTENSIONS) .

...