Jak sprawić, by cząsteczki świeciły i rzucały światło na otoczenie?

22

Obecnie próbuję zrobić efekt świetlika na ciemnym lesie. Poziom ma bardzo słabe światło, a odtwarzacz jest jednym z niewielu źródeł światła. Aby gracz mógł lepiej widzieć poziom, staram się, aby świecące świetliki pojawiały się losowo na mapie. Jednym ze sposobów jest użycie układu cząstek. Ale nie mogę sprawić, by cząsteczki rzucały światło na otoczenie. Czy jest na to sposób?

DarkDestry
źródło
3
Prawdziwy problem polega na tym, że „światło jest drogie”. Lepiej umieść niektóre stałe światła punktowe, które wystarczająco oświetlają obszar, upiecz je w mapę świetlną, a następnie użyj cząstek, aby wyjaśnić, skąd pochodzi źródło światła, zamiast używać dziesiątek okropnie drogich świateł dynamicznych.
Draco18s
@ Draco18s Nie będzie dziesiątek świetlików. Pojawią się one tylko w polu widzenia gracza. Jest z góry na dół i jako taki łatwy do kontrolowania. I w danym momencie powinno być mniej niż 10 świetlików. Czy nie 10 dynamiczne światło punktowe jest drogie?
DarkDestry,
Domyślnie Unity pozwala tylko dwóm aktywnym dynamicznym światłom oświetlać geometrię jednocześnie (chociaż może być inaczej w przypadku konfiguracji 2D). Możesz to oczywiście zwiększyć, ale pamiętaj, że światło +1 ma wpływ x2 na losowania.
Draco18s,
2
@ Draco18s może to dotyczyć ścieżki renderowania do przodu, ale jak stwierdzono w dokumentacji „Podczas korzystania z odroczonego cieniowania nie ma ograniczenia liczby świateł, które mogą wpływać na obiekt” - Wiele małych świateł, które wpływają tylko na niewielką część ekran jest dokładnie takim rodzajem użycia, jak odroczone ścieżki renderowania wyróżniają się wydajną obsługą. (Przy typowym koszcie jednego losowania na unikalne światło, a nie mnożnika jak przy renderowaniu w przód)
DMGregory
Trafne spostrzeżenie. Zazwyczaj zapominam o różnych ścieżkach renderowania.
Draco18s,

Odpowiedzi:

7

Cząstki emitujące światło są teraz wbudowaną funkcją Unity w wersji 5.5.

Po prostu włącz Światła w inspektorze cząstek, wrzuć odniesienie do prefabrykatu światła (działają światła punktowe i punktowe) i zmień Współczynnik na 1.

wprowadź opis zdjęcia tutaj

I voila, cząsteczki emitujące światło: ! [wprowadź opis zdjęcia tutaj

Okazuje się, że jest to raczej zoptymalizowana konfiguracja, działająca z prędkością 1500 + fps na moim urządzeniu, nawet przy maksymalnej liczbie świateł w setkach.

Edycja: Po pewnej obserwacji wydaje mi się, że światła cząsteczkowe przełączają się między oświetleniem na fragment i oświetleniem wierzchołków (przypuszczalnie w celu optymalizacji?). Może to generować niewielkie ilości artefaktów wizualnych, jeśli maksymalna ilość światła jest ustawiona zbyt wysoko.

Edycja2: Jak wskazał DMGregory, artefakty są produktem ubocznym optymalizacji do przodu renderowania. Odroczone oświetlenie rozwiązuje problem. Dodano ładniejszy gif

eclmist
źródło
1
To dobra wiadomość! :) Ta odpowiedź byłaby jeszcze lepsza, gdyby zawierała instrukcje krok po kroku, jak skonfigurować to z nowymi funkcjami systemu cząstek.
DMGregory
1
Zachowane oświetlenie wierzchołków przypomina trochę optymalizacje, które Unity stosuje w renderowaniu do przodu. Czy widzisz to samo zachowanie, gdy używasz odroczonej ścieżki?
DMGregory
Masz rację! Artefakty nie są już obecne podczas korzystania z odroczonej ścieżki renderowania.
eclmist
31

Heads-up:

Ta odpowiedź jest nieaktualna. Unity obsługuje teraz natywnie punktowe cząsteczki światła. Zobacz tę odpowiedź, aby uzyskać szczegółowe informacje.

Zostawię to tutaj dla każdego, kto jest ciekawy, używa starych wersji Unity lub potrzebuje więcej ręcznej kontroli niż oferuje natywna metoda - pamiętaj tylko, że natywna obsługa będzie prawdopodobnie znacznie wydajniejsza i skalowalna niż podejście przedstawione poniżej.


Nie jestem pewien, dlaczego tak wiele odpowiedzi twierdzi, że jest to trudne lub niemożliwe. Obsługa kilkudziesięciu dynamicznych świateł punktowych jest dość konwencjonalna nowoczesnego odroczonego renderingu działającego na PC.

Oto szybki przykład, który przygotowałem: Przykład świetlików ze światłami

Używam tego skryptu, aby dynamicznie odradzać wystarczającą ilość światła dla moich maksymalnych cząstek (upewnij się, że dostosujesz ustawienia Particle System, aby maksimum było rozsądne - domyślnie 1000 nie sprawi, że twoja karta graficzna będzie bardzo szczęśliwa), a następnie zaktualizuje je, aby podążały za aktywnym cząstki:

[RequireComponent(typeof(ParticleSystem))]
public class ParticleLights : MonoBehaviour {

    public Light lightPrefab;

    ParticleSystem _system;
    ParticleSystem.Particle[] _particles;
    Light[] _lights;


    void Start () {
        _system = GetComponent<ParticleSystem>();
        _particles = new ParticleSystem.Particle[_system.maxParticles];

        _lights = new Light[_system.maxParticles];
        for(int i = 0; i < _lights.Length; i++)
        {
            _lights[i] = (Light)Instantiate(lightPrefab);
            _lights[i].transform.parent = transform;
        }
    }

    void Update () {

        int count = _system.GetParticles(_particles);
        for(int i = 0; i < count; i++)
        {
            _lights[i].gameObject.SetActive(true);
            _lights[i].transform.localPosition = _particles[i].position;

            // Looks like the GetCurrentColor function was added in 5.3.
            // You can use other methods in earlier Unity versions.
            _lights[i].color = _particles[i].GetCurrentColor(_system);
        }

        for (int i = count; i < _particles.Length; i++)
        {
            _lights[i].gameObject.SetActive(false);
        }
    }
}

Edytować: możesz stworzyć prefabrykat , najpierw tworząc obiekt gry (w tym przypadku Utwórz -> Światło -> Punktowe światło), ustawiając go z żądaną nazwą / parametrami / skryptami / dziećmi, a następnie przeciągając go z hierarchii do twój odkrywca projektu. Zapisuje to obiekt jako zasób, który można ponownie wykorzystać w wielu scenach i skryptach, z pewnym stopniem dziedziczenia. Możesz usunąć kopię ze sceny, a zasób pozostanie w folderze Zasoby, do którego można będzie się odwoływać w razie potrzeby.

Upewnij się, że lightPrefab ma stosunkowo niewielki zasięg i nie rzuca cieni, aby zapewnić Ci najwyższą wydajność nad wszystkim, co dzieje się w Twojej scenie. Nie musisz sprawiać, aby sam lightPrefab był zielony (lub kolor twoich świetlików) - odbierze go z koloru cząsteczek.

Może się okazać, że masz lepszą kontrolę nad lotem świetlików, jeśli stworzysz każdy GameObject, z billboardowanym quadem i lampą dołączoną do niestandardowego skryptu ruchu / blinkig, ponieważ uzyskanie przekonującej wędrówki wymaga więcej artyzmu systemu cząstek niż Wiem. ;)

DMGregory
źródło
Właściwie ... chociaż powiedziałem, żeby nie używać rzucania cienia dla świetlików, po prostu próbowałem włączyć go w mojej przykładowej scenie i nie spowodowało to żadnych problemów. Sposób, w jaki cienie obracają się, gdy świetliki mijają obiekty, jest naprawdę fajny i może dodać do przerażającej atmosfery. Twój przebieg może się różnić w zależności od złożoności sceny i docelowego sprzętu, więc profil, aby się upewnić, ale może to być przypadek przedwczesnej optymalizacji z mojej strony. :)
DMGregory
Jak tworzysz lekki prefabrykat?
DarkDestry,
Również z jakiegoś powodu ParticleSystem.Particle odnosi się do starszej cząstki. Nie ma dla niego metody GetCurrentColor ani GetCurrentSize.
DarkDestry,
@DarkDestry Dodałem notatkę do odpowiedzi na temat tworzenia prefabrykatów. Jeśli chodzi o brakujące funkcje, może to być problem z wersją - pracuję w 5.3, we wcześniejszych wersjach Unity możesz to zrobić inaczej. Omówmy szczegóły implementacji na czacie , korzystając z pokoju, który Hamza Hasan stworzył.
DMGregory
Lekki prefabrykat jest taki sam jak zwykły prefabrykat. Został zdezorientowany, gdy wspomniany jest jako lekki prefabrykat.
DarkDestry,
3

Wiele lat temu, zanim dynamiczne światła były dostępne, po prostu użyliśmy efektu cząstek billboardu 2D z mieszaniem dodatków. Rozjaśniłoby to scenę w kierunku bieli. Rysując go z prawidłową głębokością świetlika, uzyskuje się prawie prawidłowe sortowanie. Addytywna alfa nie wymaga sortowania, gdy sama się przesadza w porównaniu do mieszania alfa. Nie zaświeci CAŁEJ sceny, ale oświetli obszar otaczający świetlika. Możesz wtedy wziąć dynamiczne światło i wybrać co kilka sekund jedną z świetlików, aby faktycznie oświetlić scenę, jeśli jej potrzebujesz.

Jest już pytanie i odpowiedź na temat efektów blasku Jak osiągnąć takie oświetlenie w Unity dla gier 2D?

Steven
źródło
0

Niestety nie miałem dużego doświadczenia z Unity w jej obecnej formie (bawiłem się nim wiele lat temu), więc nie wiem dokładnie, z jakimi zestawami funkcji musisz pracować w silniku.

W każdym razie, bez względu na silnik, z którym pracujesz, dynamiczne światła są czymś, czego należy unikać, kiedy tylko możesz. Są bardzo drogie obliczeniowo i mają tendencję do zwiększania złożoności sceny w bardzo wykładniczy sposób. Jednak, podobnie jak w przypadku większości renderingu 3D, istnieje wiele sposobów na osiągnięcie podobnych efektów poprzez oszustwo;

Możliwym sposobem na uzyskanie podobnego efektu jest odwzorowanie wcześniej przygotowanej tekstury blasku na teren poniżej świetlików (przy założeniu układu współrzędnych Y = góra / dół) z pozycjami X i Z kontrolującymi położenie blasku na terenie i przesunięcie Y z terenu kontrolującego alfa tekstury (jaśniejszy = bliżej terenu)

Istnieje oczywiście kilka wad tej metody. Nie rzucasz cieni, ponieważ nie jest używane światło, i nie wpłyniesz na żadną inną geometrię na świecie (rekwizyty, liście itp.)

JonBee
źródło
-2

Używaj Lightu źródła ognia i graj ze swoim rozmiarem w skrypcie, aby dać efekt spalania. I użyj swojego układu cząstek :)

Hamza Hasan
źródło
Na scenie nie ma ognia. Mam rzadkie cząsteczki pojawiające się i znikające. W ogóle nie ma ustalonej pozycji dla cząstek. Proszę przeczytać pytanie.
DarkDestry,
Więc o co chodzi? możesz przymocować światło do prefabrykatu cząstek, a nie we wcześniej określonych pozycjach
Hamza Hasan
Pytanie brzmi, jak to zrobić. Używam układu cząstek jedności. I nie widzę tam prefabrykatów. Chyba że prosisz mnie o stworzenie prefabrykatu, który ma światło i wygenerowanie bazy na podstawie skryptu
DarkDestry
Na scenie masz więc obiekt cząstek. Dołącz światło do tego samego obiektu gry i stwórz z niego prefabrykację, przeciągając obiekt gameObject do Eksploratora plików Unity.
Hamza Hasan
Mam na scenie obiekt Particle System. Ani cząsteczki.
DarkDestry,