Jak mogę uzyskać dobry efekt ognia dzięki mieszaniu alfa i cząsteczkom?

41

Używając następującego ustawienia dla efektu cząstek OpenGL:

SRC: GL_SRC_ALPHA
DST: GL_ONE

Tworzy mieszankę dodatków, która wygląda spektakularnie na czarnym tle, ale straszna w jaśniejszych kolorach, ponieważ zaczyna blaknąć do bieli.

Następnie użyłem mieszania alfa:

SRC: GL_SRC_ALPHA
DST: GL_ONE_MINUS_SRC_ALPHA

Pozwala to na użycie innych środowisk bez wpływu na kolor cząstek, ale same cząstki wyglądają matowo w porównaniu do mieszanki dodatków. Jak mogę uzyskać dobry efekt ognia dzięki mieszaniu alfa i cząsteczkom?

Przyłączeniowy:

Dodatek na czarno Dodatek na niebiesko

Alfa:

Alfa na czarno Alfa na niebiesko

AKTUALIZACJA:

Postępując zgodnie z radą Davida poniżej, stworzyłem osobną teksturę, a następnie zastosowałem mieszankę dodatków do efektu cząstek przed narysowaniem na fakturze. Problem polega na tym, że narysowanie tekstury alfa = 0 spowodowało pojawienie się tylko kolorowych części cząsteczki przed moją mapą świata, ponieważ zwykle zamiast tego masz czarne tło. Sztuką było użycie dwóch tekstur. Stworzyłem czarną teksturę, a następnie narysowałem na niej cząsteczki. Następnie usunąłem warstwę alfa cząstek z tej tekstury, skutecznie usuwając całą otaczającą jednolitą czerń i zanikając częściowo widoczne cząstki, pozostawiając leżącą pod spodem czerń, jak można się spodziewać podczas tworzenia dodatków mieszających cząstki na czarnym tle. Krótko mówiąc, wyczerpujący proces, ale w końcu dotarłem:

Zwykły dodatek i moja wersja

Oto wątek, w którym opublikowałem mój proces: http://www.cocos2d-iphone.org/forum/topic/28707?replies=8#post-141528

Wideo: http://www.youtube.com/watch?v=JptGbEO3b5E

Aram Kocharyan
źródło

Odpowiedzi:

17

Przyznaję, że nie znam żadnego idealnego rozwiązania tego problemu, dlatego opiszę obejście, z którym możesz się czuć lub nie:

  1. Renderuj wszystkie cząstki za pomocą mieszania dodatków do osobnej tekstury (lub renderowania celu) z tłem wyczyszczonym do przezroczystego .
  2. Czynią to fakturę (lub uczynić cel) na szczycie swojej scenie używając alpha blending .

Wypróbowałem to w Photoshopie i oto, co dostałem - nie jest idealny, ale przynajmniej lepiej zachowuje oryginalne kolory:

wprowadź opis zdjęcia tutaj

Oto oryginalna tekstura bez mieszania dodatków na cząstkach:

wprowadź opis zdjęcia tutaj

David Gouveia
źródło
Czy podzieliłoby to je na dwie tekstury i wyglądałoby tak, jakbym na tle narysował teksturę mieszanki dodatków?
Aram Kocharyan
@AramKocharyan Właściwie nie próbowałem tego osobiście inaczej niż w Photoshopie, gdzie wyniki wydawały się rozsądne. Ale myślę, że powinno to wyglądać jak twoje pierwsze zdjęcie, ale wszystkie czernie zastąpione kolorem tła. Innymi słowy, cząstki są dodawane razem, co powoduje duże podświetlenie w środku wybuchu, ale nie z tłem. Następnie wynikową eksplozję wkleja się na tło bez dodawania, co zachowuje oryginalny wygląd.
David Gouveia
Dzięki temu ma to sens, jest jak zwykłe połączenie w Photoshopie z nakładką, ale wygląda jak obraz nakładki siedzącej nad warstwą tła. Spróbuję i dam ci znać.
Aram Kocharyan
@AramKocharyan Zamieszczę wyniki, które otrzymałem w Photoshopie za kilka minut, abyś mógł je porównać.
David Gouveia
5
Po prostu to wyrzucając - ta technika może budzić obawy dotyczące wydajności ...
notlesh
4

Jak zauważył David Gouveia, nie ma satysfakcjonującego zamiennika dla mieszania dodatków na jasnym tle. Najlepszy efekt jaki znalazłem (który nie wymaga renderowania w backbufferze) to użycie następującego trybu mieszania GL:

SRC: GL_ONE
DST: GL_ONE_MINUS_SRC_ALPHA

Nie jest tak przyjemny jak mieszanie dodatków, ale o wiele lepszy niż GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA. Jeśli nieco poprawisz początkową i końcową wartość alfa i koloru, możesz uzyskać wyniki, które są bardzo zbliżone do mieszania addytywnego.

tryby mieszania cząstek

Na powyższym obrazku jest GL_SRC_ALPHA, GL_ONEpo lewej stronie, na środku jest, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHAa po prawej widać tryb mieszania, który zaproponowałbym dla tej konfiguracji.

grzmot
źródło
Zgadzam się, że dla całkowitej kontroli nad kolorem ta metoda działa świetnie.
Aram Kocharyan
Dla przypomnienia zauważyłem, że przy użyciu tej metody najlepszym sposobem na wygaszenie ognia jest zmniejszenie go do zera, ponieważ zmniejszenie alfa powoduje, że ogień gaśnie na biało.
Aram Kocharyan
3

Próbowałeś używać obu? Nakładaj na cząsteczki mieszanie alfa, które powinno uzyskać twoje kolory tak, jak chcesz, a następnie wróć z mieszaniem dodatkowym, aby uzyskać przyjemny efekt, którego szukasz.

notlesh
źródło
To może być moja następna opcja, chcę jednak ograniczyć cząstki do minimum. Mam nadzieję, że mogę połowę obu.
Aram Kocharyan
3

Po pierwsze, obrazy cząsteczek, których używasz, wydają się mieć czarne tło, co powoduje powstawanie ciemnych obwódek na tym drugim obrazie. Nie rób tego; to znaczy nie rysuj kształtu cząsteczki na kanałach kolorów. Zamiast tego obraz powinien być jednolicie pokolorowany i określać tylko kształt w kanale alfa.

Takie działanie znacznie poprawi wygląd przezroczystości alfa. Następnie możesz dalej poprawić wygląd ogólnego efektu, zmieniając kolor cząsteczek przez cały okres ich użytkowania. Podobnie, podstawowy obraz jest bardzo jasny, co daje centralnie jasny żółty obszar. Następnie odcień cząsteczek czerwonawo-pomarańczowy i z czasem zwiększaj odcień. W ten sposób cząstki ciemnieją, gdy wychodzą z centrum.

jhocking
źródło
Tak, tekstura jest tylko pędzlem w kolorze białym, a alfa różni się od środka.
Aram Kocharyan
huh, jeśli to prawda, to dziwne dla mnie, że twój zrzut przezroczystości alfa ma te ciemne aureole wokół cząstek.
jhocking
Tak, nie jestem pewien, dlaczego powstały wokół mieszania alfa. Ale dla tego, co mam teraz, wydaje się być w porządku.
Aram Kocharyan
Zobacz youtube.com/watch?v=JptGbEO3b5E
Aram Kocharyan
Wygląda to całkiem nieźle, powinieneś umieścić to w aktualizacji pytania.
jhocking