Skocz do zawartości

Unity3d - rendering chmury punktów w systemie Android (zadanie zaawansowane)


Recommended Posts

Na początek chciałbym podziękować użytkownikowi Fiber za pomoc w rozwiązaniu poprzedniego zadania.

http://forum.benchmark.pl/topic/204735-zamiana-liczb-szesnastkowych-na-dziesi%C4%99tne-ujemne-i-u%C5%82amkowe/

W nawiązaniu do tematu, podjąłem się zadania zaprojektowania aplikacji, która pozwala na wizualizację 3d chmur punktów. Do tej pory wykonałem aplikację w wersji na PC, w celu uzyskania wysokiej wydajności (rendering wielu milionów punktów) algorytm został opracowany m.in. na podstawie sposobu opisanego na tej witrynie:

https://scrawkblog.com/2014/07/02/directcompute-tutorial-for-unity-buffers/

Program na PC (do działania wymaga karty graficznej z obsługą DirectX 11) spełnił założenia i działa bezproblemowo. Problem pojawia się w przypadku zrobienia analogicznej wersji tego programu na system Android. Wiadomo, że testowy smartfon (LG P760) nie ma szans w pojedynku z kartą graficzną GTX 660 3GB w kwestii wydajnościowej, niemniej jednak problem pojawia się, gdyż dostępne standardowo sposoby powodują drastyczne spadki wydajności na smartfonie (spowodowane narzutem na CPU). Kiedyś przeprowadziłem eksperyment (animacja modelu high poly):

- pierwszy sposób poprzez użycie skryptu C# (funkcja transform.Translate);

- drugi sposób bez skryptu, użyty shader który w określonym czasie przesuwa współrzędne wierzchołków.

Pierwszy sposób powodował bardzo niski FPS, w drugim przypadku płynność animacji  była bardzo wysoka.

Tak więc (na smartfonie oczywiście nie mogę użyć compute shader'ów z DX11), pomyślałem sobie czy byłaby możliwość renderingu takiej chmury punktów przy użyciu tylko zwykłych shaderów. Współrzędne punktów  XYZ można by zakodować w postaci tekstury (np. pierwszy piksel to współrzędna X - 32 bity

to wystarczająca ilość danych, drugi piksel to współrzędna Y itp. - w teksturze 2048x2048 można w ten sposób zakodować ponad milion punktów). Wiem, że w normalnym trybie renderingu każdy vertex jest mnożony przez macierz MVP (iloczyn model, view, perspective matrix) a potem rasteryzowany na Screen Coordinates i wyświetlany na ekranie. Więc, teoretycznie, taka zdekodowana wartość float3 (współrżedne punktu) mogłaby być w shaderze mnożona przez taką macierz i w efekcie wyświetlona na ekranie jako pojedynczy piksel (jako postprocessing).

Czy moje rozumowanie ma sens ? Jeśli byłaby możliwość rozwiązania tego zadania, jestem w stanie zapłacić za pomoc.

 

Link to post
Share on other sites

Zdecydowanie nie powinieneś mnożyć macierzy przez większą liczbę punktów na CPU. Musisz zmusić do tego GPU. Niestety programowanie architektury telefonów jest mi raczej obce, więc za dużo nie pomogę.

W granicach rozsądku samą translację można próbować udźwignąć na CPU, ale bez korzystania z macierzy.

Link to post
Share on other sites

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Odpowiedz w tym wątku...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...