XNA Dodawanie kraterów (przez GPU) z efektem „Burn”

11

Obecnie pracuję nad klonem 2D „Worms” w XNA, a jedną z cech jest teren „odkształcalny” (np. Gdy rakieta uderzy w teren, nastąpi eksplozja, a fragment terenu zniknie).

To, co obecnie robię, polega na użyciu tekstury o stopniowo wyższej wartości czerwonej, gdy zbliża się do środka. Cyklicznie zmieniam każdy piksel tej tekstury „Deformacji”, a jeśli aktualny piksel zachodzi na piksel terenu i ma wystarczająco wysoką czerwoną wartość, modyfikuję tablicę kolorów reprezentującą teren do przezroczystej. Jeśli bieżący piksel NIE ma wystarczająco wysokiej wartości Czerwonej, czernieję kolor terenu (robi się bardziej czarny, im bliżej wartości Czerwonej jest do progu). Pod koniec tej operacji używam SetData do aktualizacji tekstury terenu.

Zdaję sobie sprawę, że nie jest to dobry sposób, aby to zrobić, nie tylko dlatego, że czytałem o straganach z rurociągami i tym podobnych, ale także dlatego, że może stać się dość opóźniony, jeśli dodaje się wiele kraterów w tym samym czasie. Chcę przerobić moją generację kraterów na GPU, zamiast tego używając renderowania „ping-ponging” pomiędzy byciem celem a teksturą do modyfikacji. To nie jest problem, wiem jak to zrobić. Problem polega na tym, że nie wiem, jak utrzymać efekt oparzenia przy użyciu tej metody.

Oto jak wygląda teraz efekt wypalenia:

Efekt spalania

Czy ktoś ma pomysł, jak stworzyć podobny efekt przypalenia (przyciemnienie krawędzi wokół uformowanego krateru)? Zupełnie nie znam Shaderów, ale jeśli będzie to wymagało, byłbym naprawdę wdzięczny, gdyby ktoś poprowadził mnie przez to, jak to zrobić. Jeśli są jeszcze inne sposoby, które byłyby świetne.

Benixo
źródło
To może pomóc: gamedev.stackexchange.com/q/6721/1163
Adam Harte,

Odpowiedzi:

7

Jeden ze sposobów, w jaki możesz to zrobić, jest podobny do tego, co robiłeś. Mają teksturę „Uszkodzenie” i faktyczną teksturę tła, ale zamiast kopiować dane za każdym razem, zachowaj je jako dwie osobne tekstury.

Po wykonaniu wybuchu narysuj okrąg na fakturze Obrażeń, który ma lekko przezroczystą krawędź. Będzie to obszar „nagrywania”.

Ilekroć rysujesz teren, podaj GPU obie tekstury i niech twój moduł cieniujący pomnoży kolor (.rgb) pikseli tła przez 1 - wartość alfa tekstury uszkodzenia. Pozbądź się w pełni czarnych pikseli (alfa do 0 lub możesz pomnożyć to również do alfa (.rgba zamiast .rgb), w zależności od tego, czy chcesz mieć przezroczyste spalone obszary) i voila!

Wątpię, aby to było najlepsze rozwiązanie, ale jest dość podobne do tego, co zrobiłeś wcześniej, co może ułatwić przesyłanie. Prawdopodobnie możesz też uciec od podania szeregu Vector3 (x, y, promień) i zrobienia matematyki w module cieniującym w oparciu o te punkty eksplozji, ale nie jestem pewien co do skuteczności takich.

Mam nadzieję że to pomoże!

Lunin
źródło
Dzięki! To też fajny sposób na zrobienie tego i podobny do tego, co robię teraz, jak powiedziałeś. Nic nie wiem o HLSL, ale na pewno się tym zajmę. Innym sposobem, w jaki powiedziano mi, że mogę to zrobić, jest czernienie go, gdy zbliżam się do krawędzi krateru, ale spróbuję również w ten sposób.
Benixo,