pentaggon 41 Napisano 8 Lutego 2016 Udostępnij Napisano 8 Lutego 2016 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. Cytuj Link to post Share on other sites
Fiber 11 Napisano 10 Lutego 2016 Udostępnij Napisano 10 Lutego 2016 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. Cytuj Link to post Share on other sites
Recommended Posts
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ą.