Каков наилучший способ обращения с FBO в OpenGL?

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

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

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

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

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

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

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

Ответы

Ответ 1

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


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

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

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

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

Ответ 2

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

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

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

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