Zamów niezależną przezroczystość w układzie cząstek

9

Piszę układ cząsteczek i chciałbym znaleźć sposób na uzyskanie właściwego mieszania alfa bez sortowania cząstek, ponieważ:

  • Każda cząstka jest duszkiem punktowym w pojedynczej siatce i nie mogę użyć zdolności wykresu sceny do sortowania przezroczystych węzłów. Węzeł systemowy powinien być jednak odpowiednio posortowany.
  • Pozycja cząstek jest obliczana na module cieniującym na podstawie prędkości początkowej, przyspieszenia i czasu. Aby posortować system, musiałbym wykonać wszystkie te obliczenia na procesorze, czego chcę uniknąć.
  • Sortując setki cząstek w zależności od pozycji kamery i przesyłając ją na GPU, każda ramka łączy się, aby była cicha i ciężka.

Testy alfa wydają się być wystarczająco szybkie w GLES 2.0 i działają dobrze w przypadku nieprzezroczystych, ale „zamaskowanych” tekstur. Nadal jednak nie wystarczy dla półprzezroczystych cząstek.

Jak sobie z tym poradzisz?

Stepan Zastupov
źródło
Jak absolutnie niezbędne jest ich właściwe sortowanie? Czy rzeczywiście widziałeś jakieś (ważne) artefakty wykorzystujące mieszanie wanilii?
ChrisE
Cząstka może mieszać się z tłem zamiast innej cząstki, a wtedy esencja „duszka-punkt” jest bardzo zauważalna. Testy alfa pomagają tutaj, ale artefakty są nadal zauważalne, gdy wartość alfa jest cicha, ale niewystarczająca do odrzucenia fragmentu.
Stepan Zastupov
6
Czy próbowałeś wyłączyć zapisy głębokości (pozostawiając włączone testy głębokości) podczas renderowania cząstek? To powinno sprawić, że nieprawidłowe zamówienie będzie mniej oczywiste.
Adam
2
Po kilku eksperymentach odkryłem, że wyłączenie zapisu głębokości jest najlepszym rozwiązaniem w większości przypadków.
Stepan Zastupov

Odpowiedzi:

10

Oto co bym zrobił.

Krok 1: Nie sortuj. Po prostu to zrób. Sprawdź, czy to problem. Najprawdopodobniej nie jest.

Krok 2: Ogranicz cząstki do takich, które tak naprawdę nie wymagają sortowania, takich jak:

  • Tylko bryły (z możliwymi krawędziami alfa do pokrycia)

    • niech zbuffer zajmie się sortowaniem.
  • Tylko bity addytywne

    • a + b = b + a, więc kolejność nie ma znaczenia

Krok 3: jeśli potrzeba więcej, podziel renderowanie cząstek na kawałki, które muszą znajdować się z przodu i reszty, i wykonaj renderowanie w kilku przejściach (na przykład może naprawić złożony dym)

Krok 4: jeśli nadal potrzeba więcej lub potrzebujesz ogólnego rozwiązania, jedną z rzeczy, które przychodzą na myśl, byłoby użycie MRT, aby uzyskać bardzo zgrubne sortowanie wiaderka N; renderuj cząstki na N powierzchni wyjściowych i komponuj je w osobnym przejściu.

Wszystko inne wymagałoby więcej informacji na temat konkretnego przypadku użycia. Ale jestem pewien, że tak naprawdę wcale nie potrzebujesz niezależności od zamówienia. Wystarczy użyć wystarczającej liczby losowych cząstek, a będzie dobrze =)

Jari Komppa
źródło
6

Po prostu nie zapisuj do bufora głębokości podczas renderowania cząstek. Umożliwi to ich renderowanie i łączenie ze sobą. Nadal powinieneś jednak przeprowadzać testy głębokości, aby mogły zostać poprawnie zasłonięte przez geometrię w scenie.

KlashnikovKid
źródło
5

Stosowanie kolejności mieszania dodatków nie ma znaczenia:

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)

Zakłada się, że tekstura duszka ma przezroczyste tło.

teh_leecherer
źródło