Замовте незалежну прозорість у системі частинок


9

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

  • Кожна частинка є спрайтом точки в одній сітці, і я не можу використовувати здатність графіка сцени для сортування прозорих вузлів. Однак, системний вузол повинен бути правильно відсортований.
  • Положення частинок обчислюється на шейдері з початкової швидкості, прискорення та часу. Для того щоб сортувати систему, я повинен був би виконати всі ці обчислення на процесорі, чого я хочу уникати.
  • Сортування сотень частинок за положенням камери та завантаження їх на кожен графічний шов є тихою важкою роботою.

Альфа-тестування здається досить швидким на GLES 2.0 і прекрасно працює для непрозорих, але "замаскованих" текстур. Все-таки недостатньо полупрозорих частинок.

Як би ти впорався з цим?


Абсолютно важливо, наскільки правильно їх сортувати? Ви насправді бачили якісь (важливі) артефакти, використовуючи ванільну суміш?
ChrisE

Частинка може поєднуватися з фоном замість іншої частинки, і тоді «прямокутник» суть точкового спрайту дуже помітна. Тут допомагає тестування на альфа, але артефакти все ще помітні, коли значення альфа тихо низьке, але недостатньо, щоб відкинути фрагмент.
Степан Заступов

6
Ви намагалися вимкнути глибинні записи (залишаючи випробування на глибину) під час надання частинок? Це повинно зробити неправильне впорядкування менш очевидним.
Адам,

2
Після деяких експериментів я виявив, що відключення глибини запису - найкраще рішення у більшості випадків.
Степан Заступов

Відповіді:


10

Ось що б я зробив.

Крок 1. Не сортуйте. Просто зроби це. Подивіться, чи це проблема. Швидше за все, ні.

Крок 2: Обмежте частинки на такі, які насправді не потребують сортування, наприклад:

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

    • нехай zbuffer піклується про сортування.
  • Просто шматочки добавки

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

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

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

Все, що потребує додаткової інформації, потребує додаткової інформації щодо конкретного випадку використання. Але я впевнений, що вам дійсно не потрібна незалежність замовлення. Просто використовуйте достатню кількість випадкових частинок, і це буде нормально =)


6

Просто не записуйте в буфер глибини при візуалізації частинок. Це дозволить їх усім викласти та змішати один з одним. Ви все ще повинні провести глибинні випробування, хоча вони можуть бути належним чином закладені геометрією в сцені.


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)

Це передбачає, що текстура спрайту має прозорий фон.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.