Каков наилучший способ обработки FBO в OpenGL? - PullRequest
15 голосов
/ 04 февраля 2010

Интересно, как долго можно было бы обрабатывать объекты OpenGL FrameBuffer (FBO)? Переключение FBO может быть дорогостоящим, но также определяет новые приложения.

Как ты это делаешь быстро ?

Я колеблюсь между этими 3:

  • 1 FBO для всего, смените приложение, но не переключайтесь между FBO

  • 1 FBO для каждой цели рендеринга (размер + формат) на пути рендеринга. Это означает, что я буду использовать тот же FBO для аналогичных целей рендеринга. Но в этом случае пользовательское размытие обойдется в 4+ FBO.

  • 1 FBO для каждой цели рендеринга, устанавливать вложения только один раз, а затем переключаться между FBO

Кроме того, я должен минимизировать количество переключателей FBO (как я минимизирую количество текстурных привязок)?

Ответы [ 2 ]

14 голосов
/ 05 февраля 2010

Обновлены ссылки:


NVIDIA 2005 ( возможно, устарел ): Последняя официальная рекомендация NVIDIA по производительности - почти пять лет. В своей презентации GDC Саймон Грин рекомендует следующее (слайд 29):

В порядке увеличения производительности:

  1. Несколько FBO
    • создайте отдельное FBO для каждой текстуры, которую вы хотите визуализировать в
    • переключатель с помощью BindFramebuffer()
    • может быть в 2 раза быстрее, чем wglMakeCurrent() в бета-драйверах NVIDIA
  2. Один FBO, несколько текстурных вложений
    • текстуры должны иметь одинаковый формат и размеры
    • используйте FramebufferTexture() для переключения между текстурами
  3. Один FBO, несколько текстурных вложений
    • прикрепить текстуры к различным цветным вложениям
    • используйте glDrawBuffer() для переключения рендеринга на различные цветовые вложения

По моему опыту, второй корпус действительно быстрее первого (ATI Radeon HD4850, Geforce 8800GT). Я не пробовал третий случай, поскольку он усложнил бы мой код.

4 голосов
/ 04 февраля 2010

С точки зрения философии, изменение состояния объекта требует его повторной проверки.Вместо этого простое изменение привязки объекта (это уже действует в предыдущем кадре) должно быть быстрее для драйвера [1].

Так что в качестве первой реализации я бы выбрал 1 FBO для каждой цели рендеринга (или, точнее, рендеринг цели set . Обычно вы рендеритесь в несколько буферов одновременно).

Тем не менее, ничто не сравнится с сравнением вашего приложения с множеством реализаций.

[1] Я упоминаю для драйвера, потому что изменение FBO может вызвать сброс GPU, в зависимости от архитектуры.Это введет пузыри в большинстве случаев.Так что это определенно то, что вы не хотите делать часто.Это важнее, чем оптимизация текстурных привязок, например

...