glReadPixels () медленно читает GL_DEPTH_COMPONENT - PullRequest
4 голосов
/ 31 марта 2011

Мое приложение зависит от чтения информации глубины обратно из кадрового буфера. Я реализовал это с помощью glReadPixels (0, 0, ширина, высота, GL_DEPTH_COMPONENT, GL_FLOAT и глубина_данных)

Однако, это работает неоправданно медленно, оно переносит мое приложение с плавных 30 кадров в секунду до медленных 3 кадров в секунду. Если я попытаюсь прочитать другие измерения или данные, они будут работать на приемлемом уровне.

Чтобы дать обзор:

  • без glReadPixels -> 30 кадров в секунду
  • glReadPixels (0, 0, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT и глубина_данных); -> 20 кадров в секунду, приемлемо
  • glReadPixels (0, 0, ширина, высота, GL_RED, GL_FLOAT и глубина_данных); -> 20 кадров в секунду, приемлемо
  • glReadPixels (0, 0, ширина, высота, GL_DEPTH_COMPONENT, GL_FLOAT и глубина_данных); -> 3 кадра в секунду, не приемлемо

Почему последний должен быть таким медленным по сравнению с другими вызовами? Есть ли способ исправить это?

ширина х высота приблизительно 100 х 1000, вызов становится все медленнее, когда я увеличиваю размеры.

Я также пытался использовать объекты пиксельного буфера, но это не оказывает существенного влияния на производительность, оно только задерживает медлительность до вызова glMapBuffer ().

(Я тестировал это на MacBook Air nVidia 320m OS X 10.6, как ни странно, мой старый MacBook Intel GMA x3100 получил ~ 15 кадров в секунду при чтении буфера глубины.)

ОБНОВЛЕНИЕ: Исключение GLUT_MULTISAMPLE из параметров glutInitDisplayMode привело к огромным различиям, вернув приложение снова к плавным 20 кадрам в секунду. Я не знаю, что делает опция в первую очередь, кто-нибудь может объяснить?

Ответы [ 3 ]

3 голосов
/ 31 марта 2011

Если ваш основной кадровый буфер поддерживает MSAA (присутствует GLUT_MULTISAMPLE), то создаются 2 фактических кадровых буфера - один с MSAA и один обычный.

Первый необходим для вас. Он содержит переднюю и заднюю цветные поверхности, а также глубину и трафарет. Второй должен содержать только цвет, полученный путем разрешения соответствующей поверхности MSAA.

Однако, когда вы пытаетесь прочитать глубину, используя glReadPixels, драйвер вынужден также разрешать поверхность глубины с поддержкой MSAA, что, вероятно, вызывает замедление.

0 голосов
/ 18 января 2013

Независимо от того, GL_LOAT или GL_UNSIGNED_BYTE, glReadPixels все еще очень медленный.Если вы используете PBO для получения значения RGB, это будет очень быстро.При использовании PBO для обработки значения RGB загрузка ЦП составляет 4%.Но это увеличится до 50% при обработке значения глубины.Я пробовал GL_FLOAT, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, GL_UNSIGNED_INT_24_8.Таким образом, я могу заключить, что PBO бесполезен для чтения значения глубины

0 голосов
/ 31 марта 2011

Какой формат хранения вы выбрали для буфера глубины?

Если это не GLfloat, то вы просите GL преобразовать каждую глубину в буфере глубины в плавающее при ее чтении. (И то же самое для вашей третьей пули с GL_RED. Был ли ваш цветной буфер плавающим буфером?)

...