Интересно с долгого времени, что было бы лучшим способом обработать Объекты OpenGL FrameBuffer (FBO). Переключение FBOs может быть дорогостоящими но определяющими новыми вложениями также.
Как дела это быстро?
Я колеблюсь между этими 3:
1 FBO для всего, измените вложение, но не переключайтесь между FBOs
1 FBO для каждой цели рендеринга (размер + формат) в пути рендеринга. Это означает, что я снова использую тот же FBO для подобных целей рендеринга. Но этот путь пользовательская размытость стоил бы 4 + FBOs.
1 FBO для каждой цели рендеринга, вложения набора только однажды и затем переключается между FBOs
Кроме того, я должен минимизировать количество переключателей FBO (как, я минимизирую количество привязки структуры)?
Обновленные ссылки:
NVIDIA 2005 (, вероятно, устарело ): Последняя официальная рекомендация по производительности от NVIDIA Я знаю, что ему почти пять лет.В своей презентации GDC Саймон Грин рекомендует следующее (слайд 29):
В порядке увеличения производительности:
- Несколько FBO
- создают отдельный FBO для каждой текстуры, которую вы хотите визуализировать, для переключателя
- с использованием
BindFramebuffer ()
- может быть в 2 раза быстрее, чем
wglMakeCurrent ()
в бета-драйверах NVIDIA- Один FBO, несколько текстур вложения
- текстуры должны иметь одинаковый формат и размеры
- используйте
FramebufferTexture ()
для переключения между текстурами- Один FBO, несколько вложений текстур {{1 }}
- прикрепляйте текстуры к разным цветным присоединениям
- используйте
glDrawBuffer ()
для переключения рендеринга на разные цветовые присоединения
По моему опыту, второй случай действительно быстрее, чем первый (ATI Radeon HD4850, Geforce 8800GT). Третий случай я не пробовал, так как это усложнило бы мой код.
С точки зрения философии, изменение состояния объекта требует его повторной проверки. Вместо этого простое изменение привязки объекта (которая уже действительна из предыдущего кадра) должно быть быстрее для драйвера [1].
Итак, в качестве первой реализации я бы выбрал 1 FBO для каждой цели рендеринга (или, точнее, цель рендеринга , установленная . Обычно рендеринг выполняется в несколько буферов одновременно).
Тем не менее, ничто не сравнится с тестированием вашего приложения на нескольких реализациях.
[1] Я упоминаю для драйвера, потому что изменение FBO может вызвать сброс графического процессора, в зависимости от архитектуры. В большинстве случаев это приведет к появлению пузырей. Так что это определенно то, чем вы не хотите часто заниматься. Это важнее, чем оптимизация привязок текстур, например