Рендеринг OpenGL ES в пользовательскую память
Мне нужно реализовать рендеринг вне экрана в текстуру на устройстве 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 ответа
Решаемые.
Способ принудительного рендеринга оборудования OpenVR в выделенную пользователем память: http://processors.wiki.ti.com/index.php/Render_to_Texture_with_OpenGL_ES
Пример того, как его использовать: https://gforge.ti.com/gf/project/gleslayer/
После всего этого я могу получить отрендеренное изображение всего за 5 мс.
Когда вы вызываете функции opengl, вы ставите команды в очередь в очередь рендеринга. Эти команды выполняются графическим процессором асинхронно. Когда вы вызываете glReadPixels, процессор должен подождать, пока gpu завершит рендеринг. Таким образом, колл может ждать окончания этого розыгрыша. На большинстве аппаратных средств (по крайней мере, на тех, на которых я работаю) память разделяется между процессором и процессором, поэтому пиксель чтения не должен быть таким медленным, если выполняется рендеринг.
Если вы можете дождаться результата или отложить его до следующего кадра, вы можете больше не видеть эту задержку
Объекты кадрового буфера - это то, что вы ищете. Они поддерживаются в OpenGL ES и PowerVr-SGX
РЕДАКТИРОВАТЬ: Имейте в виду, что аппаратное обеспечение GPU/CPU невероятно оптимизировано для перемещения данных в одном направлении от стороны процессора к стороне GPU. Обратный путь от графического процессора к центральному процессору часто намного медленнее (просто не приоритетно тратить аппаратные ресурсы). Итак, какую бы технику вы ни использовали (например, FBO/getTexImage), вы будете использовать этот предел.