Jak utworzyć wiele reflektorów 2D?

12

Chcę stworzyć efekt „reflektora” 2D, który pozwoli na wyróżnienie wielu podmiotów. To znaczy, jakby kilka duszków trzymało pochodnie. W przypadku pojedynczego bytu (jedno światło punktowe) używam techniki, w której nakładam duszek gradientu i mam punkt środkowy, który go ściga. Ta technika działa dobrze dla pojedynczego reflektora. Oto zrzut ekranu ilustrujący to, o czym mówię:

Pojedynczy reflektor - działa

Efekt reflektora z jednym reflektorem

Problem, na który wpadam, polega na tym, że ta technika nie obejmuje wielu bytów. Jeśli nałożę inny obraz reflektora, napotkam kilka problemów. Oto symulowany zrzut ekranu:

Wiele reflektorów = problemy

Efekt reflektora z dwoma reflektorami

Najbardziej oczywistym problemem są widoczne rogi. Można to rozwiązać, czyniąc obraz reflektora gigantycznym, obejmującym cały poziom, ale to nie wydaje się właściwe. Drugim i trudniejszym problemem jest to, że skutecznie pomnażam ciemność za pomocą tej techniki. Więc każdy dodany duszek powoduje zaciemnienie wszystkich pozostałych. Najwyraźniej podchodzę do tego problemu niepoprawnie.

Jakieś pomysły?


Kontynuacja wysiłków

W komentarzach pojawiła się dyskusja na temat opcji mieszania. Oto moje obecne myślenie. W powyższym przykładzie z jednym wyróżnieniem używam pliku obrazu, który wygląda mniej więcej tak: (Przezroczystość zastąpiłem kolorem zielonym, aby ułatwić zilustrowanie)

Podejście do przejrzystości

Jak omówiono powyżej, problem polega na tym, że alfa zmieszanie tego obrazu z innym obrazem nie da pożądanego efektu. Zamiast tego spowoduje to:

Nakładanie dwóch kół przezroczystości

Nie wydaje mi się to problemem mieszania opcji. Wydaje mi się, że problem polega na tym, że ten rodzaj obrazu ma wbudowaną maskę przezroczystości i obraz (czarny kwadrat), kiedy należy je rozdzielić.

Więc zamiast czarnego obrazu z wbudowaną wycinaną przezroczystością, powinienem używać masek przezroczystości, które są używane w czasie wykonywania względem czarnego kwadratu. Robiąc to, nadal nie mogę użyć tradycyjnej biało-czarnej maski przezroczystości lub napotka na ten sam problem. Oto przykład, tym razem biel i czerń reprezentują biel i czerń:

Maska przezroczystości

Wydaje się, że rozwiązaniem byłoby zastosowanie maski przezroczystości, która sama wykorzystuje przezroczystość. Coś w tym stylu: (zielony = przezroczysty)

Maska przezroczystości z przezroczystością

W ten sposób wiele masek przezroczystości można ze sobą mieszać, a NASTĘPNIE używać ich jako maski przezroczystości na czarnym kwadracie. Oto przykład dwóch połączonych razem masek przezroczystości alfa:

Dwie maski przezroczystości z przezroczystością

W każdym razie takie podejście wdrażam. Opublikuję wyniki, jeśli to zadziała. Nie wiem (obecnie), czy mogę użyć maski przezroczystości, która sama ma przezroczystość.

Cameron Fredman
źródło
Myśląc o tym, wydaje mi się, że powinienem przesuwać maski przezroczystości i nakładać je na dużą czarną teksturę. Nie mam pojęcia, jak by to było zrobione.
Cameron Fredman,
7
Nie wiesz, w jaki sposób tworzysz lub stosujesz gradienty, jednak może to być problem z mieszaniem, w przypadku którego użycie odpowiedniego mieszania będzie działać dobrze. Potrzebowalibyśmy więcej informacji o teksturach.
dennmat
Używam AndEngine jako frameworka, a większość z mieszania odbywa się za kulisami, chociaż dostępna jest funkcja „setBlendFunction ()” .
Cameron Fredman,
Patrząc na to, z czym się łączysz, powiedziałbym, że prawdopodobnie potrzebujesz drugiego rozwiązania wymienionego na dole lub trzeciego, jeśli to nie zadziała. Nie mam jasności na temat andEngine i wydawało się, że nie mają dokumentów, być może jeśli nie możesz znaleźć odpowiedzi w tym wątku, mogą pomóc w dalszym ciągu, ponieważ wygląda na to, że już bawią się mieszaniem wiele opcji za kulisami.
dennmat
Chociaż ten wątek wydaje się w pierwszej kolejności naprawiać problem, czy masz wersję z tą zmianą?
dennmat

Odpowiedzi:

3

Pod względem koncepcyjnym rozwiązanie wielu reflektorów składa się z:

  1. Zacznij od całkowicie czarnej tablicy, aby zachować wartości oświetlenia dla każdego piksela w scenie.
    • Zero będzie reprezentować obszar obrazu bez żadnego światła.
    • 100% reprezentuje obszar całkowicie nasycony światłem dziennym.
    • Jeśli chcesz się spodobać, możesz mieć wartość wyższą niż 100% (powiedzmy 200%), która jest przesyconym obszarem obrazu i rozmywa wszystko w oślepiającą białą plamę pikseli. Martw się o to później i na razie ogranicz wartości od 0 do 100%.
  2. Dla każdego źródła światła na ekranie lub na tyle blisko krawędzi, że jego aureola doda do światła, dodaj wartości światła z tego źródła światła do tablicy wartości światła dla pikseli sceny.
  3. Użyj wynikowej tablicy wartości światła, aby zmodyfikować piksele sceny:
    • Piksele oświetlone światłem 0% są czarne.
    • Piksele oświetlone 100% światłem mają normalny kolor.
    • Pozostałe piksele są kolorem pośrednim.
    • Wygląda na to, że wiesz już, jak wykonać ten krok, sądząc po zrzutach ekranu.

Sztuką jest zrozumienie, że mieszanie alfa może wykonać jeden lub więcej z tych kroków. Mieszanie alfa odnosi się tylko do użycia mapy alfa / obrazu do zmodyfikowania pikseli obrazu lub tekstury w prosty sposób. Zazwyczaj oznacza to również, że będzie to szybki zestaw funkcji lub zaimplementowany za pomocą specjalnych poleceń sprzętowych, aby był szybki. Można to zrobić za pomocą zwykłych tablic i poleceń w języku normalnym, ale użycie specjalnych funkcji biblioteki alfa / biblioteki mieszania jest prawdopodobnie lepsze. ... I nie będzie mieć błędów. Czasami oznacza to, że piksele są częściowo przezroczyste, ale w twoim przypadku będzie to oznaczać:

  • Dodanie wartości alfa do każdego piksela, aby zbudować tablicę wartości światła z nr 1.
  • Użycie tablicy wartości światła z punktu 1 do rozstrzygnięcia ostatecznych kolorów pikseli z kroku 3.

Zacznę przeglądać dokumentację funkcji mieszania alfa, aby zobaczyć, jakie funkcje zapewniają łączenie różnych rodzajów pikseli. Podejrzewam, że będą miały funkcje dla każdego z kroków, które musisz wykonać, ale mogą być pod nazwami, które nie są oczywiste.

ET
źródło
Kopię tę odpowiedź i dam jej szansę. Pomysł flary / rozmycia obiektywu dla wartości powyżej 100% jest również miłym i inspirującym dodatkiem. Będzie publikować aktualizacje z wyciągniętymi wnioskami. Dzięki ET
Cameron Fredman