Четверг, 19 Декабря 2024, 06:58

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Сортировка огромного количества частиц на гпу.
puksus4Дата: Воскресенье, 05 Апреля 2020, 05:37 | Сообщение # 1
частый гость
Сейчас нет на сайте
Пишу игру на с++ и DirectX 11, в которой хочу чтоб было много частиц. Набросал тут у себя систему частиц которая живёт полностью на ГПУ, обрабатывается кучей компут шейдеров и рендерится через индирект вызовы.
И тут встал (тойсть ещё не встал, но не может не встать в будущем) вопрос: Порядок отрисовки. В случае аддитивных частиц и частиц с альфа тестом вместо блендинга на порядок рисования глубочайше пофиг. Но проблема будет с полупрозрачными неаддитивными частицами.

Нашёл в интернетах частичное решение - Битоническая сортировка (Bitonic Sort). Суть в том шо берём группы по 2 элемента, сортируем, затем делаем обмен между соответствующими элементами соседних групп так чтобы в первую попал минимальный элемент, а во вторую максимальный. Затем увеличиваем размер группы до 4, делаем то же самое, затем до 8, ... И так за log(N) шагов и общей сложностью N log^2N делаем сортировку.
Сие хозяйство несложно распараллелить чтоб эффективно выполнялось на гпу. НО. Вот допустим у меня максимальное количество частиц - миллион. Я могу написать компут шейдер в котором будет не более 1024 потоков в группе (хардварное ограничение), то есть я смогу лишь частично отсортировать массив, имея в итоге отсортированные порции по 2048 частиц, но сам по себе массив не будет отсортирован.

Вот собсно вопрос, что в этой ситуации лучше сделать? Может быть забить и частично отсортированный массив будет работать достаточно хорошо? может быть можно на гпу отсортировать по другому?
Как бы вы решали эту проблему?

Вопрос не срочный, впадлу пока что вообще сортировку на гпу фигачить.

Пока что планирую рендерить полупрозрачные частицы вообще без сортировки и завести отдельный буфер для частиц с альфа тестом.
Таким образом когда частице достаточно альфа теста - она будет писать в буфер глубины и всё будет ок, возможно с какимто хитрым шейдингом чтоб резких краёв не было, а если частице нужна полупрозрачность - ввести ограничение что полупрозрачные частицы обязаны не иметь в текстуре слишком непрозрачных пикселей. Тогда (надеюсь) артефакты от неправильного порядка отрисовки будут не очень заметными. Тойсть использовать полупрозрачные частицы для действительно полупрозрачной фигни с однородной альфой, типа пыль, дым. Возможно возникнут проблемы когда в один момент времени сначала рендерится частица 1 а затем частица 2, а затем сначала частица 2 а затем частица 1. Тогда можможно дребезжание частиц между собой будет

Кароч тема скорее для обсуждения, чем конкретное ТЗ, возможно есть какието лёгкие обходные пути и костыли


Сообщение отредактировал puksus4 - Воскресенье, 05 Апреля 2020, 05:42
drcrackДата: Воскресенье, 05 Апреля 2020, 09:29 | Сообщение # 2
старожил
Сейчас нет на сайте
вижу 2 варианта кроме сортировки всего миллиона частиц:
1. ничего не сортировать, рисовать как есть в порядке создания, да, будут артефакты, но в большинстве случаев некритичные, сильно зависит от того что там за частицы, какого размера, как перемещаются и т.д.
2. order independent transparency (т.е. фактически сортировка только того, что реально нужно сортировать)


Сообщение отредактировал drcrack - Воскресенье, 05 Апреля 2020, 09:30
puksus4Дата: Воскресенье, 05 Апреля 2020, 17:44 | Сообщение # 3
частый гость
Сейчас нет на сайте
drcrack, Спасибо, по поводу OIT годная мысля.
Нашёл тут на хабре статейку как сделать, вроде штука не особо сложная. А если будет слишком прожорливой - можно будет в настройки графики вынести выключалку.

Причём этим же методом по идее можно решить проблему что аддитивные частицы и полупрозрачные полюбасу будут рендерится разными батчами т.к. разный бленд стейт, а значит даже если отсортировать полупрозрачные - они будут глючить поверх аддитивных.
А в случае OIT мы блендим ручками, а значит можно аддитивные и полупрозрачные отрисовать за 1 батч и хранить в буфере фрагментов ещё и тип блендинга - и сблендить корректно.


Сообщение отредактировал puksus4 - Воскресенье, 05 Апреля 2020, 17:57
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг