Заказать независимую прозрачность в системе частиц

9

Я пишу систему частиц и хотел бы найти способ добиться правильного альфа-смешивания без сортировки частиц, потому что:

  • Каждая частица является точечным спрайтом в одной сетке, и я не могу использовать возможность графа сцены для сортировки прозрачных узлов. Однако системный узел должен быть правильно отсортирован.
  • Положение частиц на шейдере вычисляется по начальной скорости, ускорению и времени. Чтобы отсортировать систему, мне нужно будет выполнить все эти вычисления на CPU, чего я хочу избежать.
  • Сортировка сотен частиц по положению камеры и загрузка их на GPU в каждом кадре для тихой тяжелой работы.

Альфа-тестирование кажется достаточно быстрым на GLES 2.0 и отлично работает для непрозрачных, но «замаскированных» текстур. Тем не менее, этого недостаточно для полупрозрачных частиц.

Как бы вы справились с этим?

Степан Заступов
источник
Насколько важно, чтобы они были правильно отсортированы? Вы действительно видели какие-нибудь (важные) артефакты, используя ванильное смешивание?
ChrisE
Частица может смешиваться с фоном, а не с другой частицей, и тогда сущность «прямоугольник» точечного спрайта очень заметна. Здесь помогает альфа-тестирование, но артефакты все еще заметны, когда альфа-значение достаточно мало, но недостаточно для отбрасывания фрагмента.
Степан Заступов
6
Вы пробовали отключить запись глубины (оставляя тесты глубины включенными) при рендеринге частиц? Это должно сделать неправильный порядок менее очевидным.
Адам
2
После некоторых экспериментов я обнаружил, что отключение глубокой записи является лучшим решением в большинстве случаев.
Степан Заступов

Ответы:

10

Вот что я бы сделал.

Шаг 1: Не сортируйте. Просто сделай это. Посмотри, если это проблема. Скорее всего, нет.

Шаг 2: Ограничьте частицы так, чтобы они не нуждались в сортировке, например:

  • Только твердые тела (возможно с краями альфа-покрытия)

    • пусть zbuffer позаботится о сортировке.
  • Просто аддитивные биты

    • a + b = b + a, поэтому порядок не имеет значения

Шаг 3: если требуется больше, разделите рендеринг частиц на части, которые должны быть впереди и на остальной части, и выполните рендеринг за несколько проходов (например, можно исправить сложный дым)

Шаг 4: если все еще нужно больше или если вам нужно общее решение, одна вещь, которая приходит на ум, - это использовать MRT, чтобы выполнить очень грубую сортировку N-сегмента; рендеринг частиц в N выходных поверхностей и составить их в отдельный проход.

Что-нибудь еще потребует дополнительной информации о вашем конкретном случае использования. Но я уверен, что вам не нужна независимость от заказов. Просто используйте достаточно частиц в случайном порядке, и все будет хорошо =)

Яри ​​Комппа
источник
6

Только не пишите в буфер глубины при рендеринге частиц. Это позволит им всем быть представленными и смешанными друг с другом. Вы все равно должны выполнить тестирование глубины, чтобы они могли быть правильно перекрыты геометрией в сцене.

KlashnikovKid
источник
5

Использование порядка смешивания добавок не имеет значения:

glEnable(GL_BLEND)
glDepthMask(GL_FALSE)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
DrawParticles();

// Now turn depth masking on and blending off, so state is unchanged.
glDepthMask(GL_TRUE)
glDisable(GL_BLEND)

Это предполагает, что ваша текстура спрайта имеет прозрачный фон.

teh_leecherer
источник