Рендеринг OpenGL ES в пользовательскую память - PullRequest
4 голосов
/ 28 февраля 2012

Мне нужно реализовать рендеринг вне экрана в текстуру на устройстве ARM с аппаратным обеспечением PowerVR SGX.

Все сделано (использовались пиксельные буферы и API OpenGL ES 2.0). Единственная нерешенная проблема - очень медленная glReadPixels функция.

Я не эксперт в OpenGL ES, поэтому я спрашиваю сообщество: возможно ли рендерить текстуры непосредственно в память пользовательского пространства? Или, может быть, есть какой-то способ получить аппаратный адрес области памяти текстуры? Какой-то другой метод (расширения EGL)?

Мне не нужно универсальное решение, просто работаю с решением для оборудования PowerVR.

Обновление: Немного больше информации о "медленной функции glReadPixels". Скопируйте данные текстуры 512x512 RGB в память процессора:

  • glReadPixels(0, 0, WIDTH, HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, &arr) занимает 210 мс,
  • glReadPixels(0, 0, WIDTH, HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, &arr) занимает 24 мс (GL_BGRA не является стандартным для glReadPixels, это расширение PoverVR),
  • memcpy(&arr, &arr2, WIDTH * HEIGHT * 4) занимает 5 мс

В случае больших текстур различия также больше.

Ответы [ 3 ]

4 голосов
/ 29 февраля 2012

Решено.

Способ принудительного рендеринга оборудования OpenVR в выделенную пользователем память: http://processors.wiki.ti.com/index.php/Render_to_Texture_with_OpenGL_ES#Pixmaps

Пример, как его использовать: https://gforge.ti.com/gf/project/gleslayer/

После всего этого я могу получить отрендеренное изображение всего за 5 мс.

0 голосов
/ 28 февраля 2012

Объекты кадрового буфера - это то, что вы ищете.Они поддерживаются в OpenGL ES и PowerVr-SGX

РЕДАКТИРОВАТЬ: имейте в виду, что аппаратное обеспечение GPU / CPU невероятно оптимизировано для перемещения данных в одном направлении от стороны CPU к стороне GPU.Обратный путь от графического процессора к центральному процессору часто намного медленнее (просто не стоит тратить аппаратные ресурсы).Итак, какую бы технику вы ни использовали (например, FBO / getTexImage), вы будете использовать этот предел.

0 голосов
/ 28 февраля 2012

Когда вы вызываете функции opengl, вы ставите команды в очередь в очередь рендеринга.Эти команды выполняются графическим процессором асинхронно.Когда вы вызываете glReadPixels, процессор должен подождать, пока gpu завершит рендеринг.Таким образом, звонок может быть в ожидании окончания розыгрыша.На большинстве аппаратных средств (по крайней мере, на тех, на которых я работаю) память разделяется между процессором и процессором, поэтому пиксель чтения не должен быть таким медленным, если выполняется рендеринг.

Если вы можете дождаться результата или отложить его до следующего кадра, вы можете больше не видеть эту задержку

...