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

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

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

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

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

9 голосов | спросил Stepan Zastupov 7 MarpmMon, 07 Mar 2011 17:56:01 +03002011-03-07T17:56:01+03:0005 2011, 17:56:01

3 ответа


10

Вот что я буду делать.

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

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

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

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

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

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

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

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

ответил Jari Komppa 14 MarpmMon, 14 Mar 2011 13:27:03 +03002011-03-14T13:27:03+03:0001 2011, 13:27:03
6

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

ответил KlashnikovKid 25 FebruaryEurope/MoscowbSat, 25 Feb 2012 19:34:00 +0400000000pmSat, 25 Feb 2012 19:34:00 +040012 2012, 19:34:00
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 25 FebruaryEurope/MoscowbSat, 25 Feb 2012 04:43:36 +0400000000amSat, 25 Feb 2012 04:43:36 +040012 2012, 04:43:36

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132