Каков наилучший способ обращения с 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 может привести к отключению графического процессора в зависимости от архитектуры. В большинстве случаев он будет вводить пузыри. Поэтому это определенно то, что вы не хотите делать часто. Это более важно, чем оптимизация привязок текстур, например.