Что лучший способ состоит в том, чтобы обработать FBOs в OpenGL?

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

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

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

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

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

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

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

15
задан ponce 4 February 2010 в 10:00
поделиться

2 ответа

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


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

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

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

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

14
ответ дан 1 December 2019 в 04:00
поделиться

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

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

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

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

4
ответ дан 1 December 2019 в 04:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: