Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Использование FBO

Использование FBO

d934Пользовательwww7 ноя. 201812:28#0
Собственно, вопросов несколько.

1. Постпроцессинг. Здесь написано, что для наложения эффектов следует использовать ping-pong технику между двумя рендер таргетами. Собственно вопрос, что быстрее:
  - Использование двух фбо с одним аттачментом.
  - Использование одного фбо и двух аттачментов. Реаттачинг буферов к нулевому аттачмент поинту.
  - Использование одного фбо и двух аттачментов. Ping-pong рендер таргетов через glDrawBuffers.
Мои исследования на эту тему.
На конференции nvidia 2005 сказано, что перфоманс увеличивается по списку. Но посмотрев презентацию с конференции поновее сказано, что переключение аттачментов вызывает много валидаций на драйвере, потому переключение фбо выходит дешевле. Также, там написано, что в ping-pong технике недостаточно использовать glDrawBuffers и следует переключать аттачмент. Дак кому лучше верить?

2. MRT. Почему при использовании mrt уменьшается fps, даже если в шейдерах используется только один буфер? Так и должно быть или я что-то не правильно делаю?

3. Исходит из вопросов выше. Как в процессе рендера сцены переключать рендер таргеты в mrt? Например, что-то хочется отрендерить во все буферы, что-то только в нулевой. Первое, что приходит на ум - glDrawBuffers. Но вероятнее всего, вызов также вызывает валидации на драйвере (моя догадка) и поэтому выгоднее переключать fbo, у которых нулевой буфер будет общим. Правда, если бы MRT не вызывал уменьшения fps, то этого вопроса и не возникло бы. Просто в шейдерах записывал бы в нужные буферы и все.

vindastПостоялецwww7 ноя. 201813:52#1
d934
> Использование двух фбо с одним аттачментом.
Проще и быстрее.
Если нет нужды поддерживать старые версии opengl, то можно попробовать сделать все это дело на вычислительных шейдерах. Спорну что ты пытаешься сделать систему частиц на гпу таким образом.


d934
> выгоднее переключать fbo, у которых нулевой буфер будет общим.
По моему это invalid framebuffer operation
Нужно отвязать текстуру от первого и привязать ко второму.


Присоединяюсь к второму и третьему вопросу.

Правка: 7 ноя. 2018 13:53

/A\Постоялецwww7 ноя. 201814:07#2
Я бы использовал compute shader или посмотрел примеры с glTextureBarrier - как раз добавили для оптимизации чтения/записи в одну текстуру.
d934Пользовательwww7 ноя. 201814:24#3
vindast
> Спорну что ты пытаешься сделать систему частиц на гпу таким образом.
Да нет же. Я же написал, что просто постпроцессинг. Например, двухпроходный блюр.

vindast
> По моему это invalid framebuffer operation
> Нужно отвязать текстуру от первого и привязать ко второму.
Да? Нужно потестить этот момент или найти официальную инфу. А так, это просто моя догадка. Пока что использую glDrawBuffers.
Хотя это немного странно. И емнип, я уже пробовал делить между двумя фбо буфер глубины без всяких отвязываний-привязываний и оно работало. Или это не правильно и где-то может не заработать?

vindastПостоялецwww7 ноя. 201814:49#4
d934
Лично у меня такая шляпа есть.
DanilwПользовательwww7 ноя. 201815:37#5
>TextureBarrier
это OpenZGL 4.5
лучше уж vulkan делать, если есть поддержка 4.5 то и вулкана тоже

для GLES ничего кроме биндинга фреймбуферов по кругу нет(с одним дополнительным для копирования)

AndreyПостоялецwww8 ноя. 20188:28#6
Danilw
> лучше уж vulkan делать, если есть поддержка 4.5 то и вулкана тоже
Это далеко не так.

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр