Skocz do zawartości

Parallel Poisson Disk Sampling with Spectrum Analysis on Surfaces


Obywatel

Rekomendowane odpowiedzi

Cześć,

 

prezentuję implementację algorytmu przedstawionego w dokumencie "Parallel Poisson Disk Sampling with Spectrum Analysis on Surfaces", służącego do równomiernego rozmieszczenia punktów na obiekcie. Dokumentacja programu dostępna jest pod tym adresem: http://research.microsoft.com/apps/pubs/default.aspx?id=135760

Projekt zrealizowany jest w postaci pluginu (DG Node) do Autodesk Maya 2013 w oparciu o technologię NVIDIA CUDA.

 

 

 

 

Rozmieszczanie punktów na obiekcie odbywa się praktycznie w czasie rzeczywistym. Wcześniej miałem okazję zaimplementować sekwencyjny algorytm

i różnica w szybkości działania jest znaczna. Dużą zaletą współbieżnego algorytmu od Microsoftu jest stosunkowo niewielki wpływ ilości poligonów na szybkość obliczeń, który w przypadku sekwencyjnego algorytmu miał istotne znaczenie, ponieważ każdy trójkąt wymagał przetwarzania.

 

Plugin skompilowany dla Linuxa 64bit, Autodesk Maya 2013, dystrybucja Funtoo/Gentoo, wymagane biblioteki CUDA. Nie sprawdzałem działania na innych dystrybucjach. Jeśli znajdę czas to postaram się skompilować dla Windowsa. Wyniki obliczeń węzła można wykorzystać w instancerze. Obecnie brak obliczonych rotacji, więc praktyczne zastosowanie póki co niewielkie. Mam jednak nadzieję, że uda mi się w najbliższym czasie stworzyć bardziej kompletne narzędzie.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 5
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Potrzebujesz do poprawnego działania poprawnych UVek? Jaką klasą są wyświetlane punkty? Czy pobranie z pozycji punktu normalki face'a znacznie by wydłużyło czas obliczeń? W czym przydatne było wykorzystanie bibliotek CUDA? Obsługujesz wielowątkowość w swoim nodzie? Kurde - można by wykorzystać te punkty do auto UV unwrappingu.

Odnośnik do komentarza
Udostępnij na innych stronach

Gość User190
Potrzebujesz do poprawnego działania poprawnych UVek? Jaką klasą są wyświetlane punkty? Czy pobranie z pozycji punktu normalki face'a znacznie by wydłużyło czas obliczeń? W czym przydatne było wykorzystanie bibliotek CUDA? Obsługujesz wielowątkowość w swoim nodzie? Kurde - można by wykorzystać te punkty do auto UV unwrappingu.

 

Jest wielowątkowość i działa to naprawdę szybko. Michał robił porównania z dtos i różnica wyszła chyba ponad 100 razy na korzyść ppds (ale to już najlepiej pytać jego).

Dobra robota Zią :)

Edytowane przez User190
Odnośnik do komentarza
Udostępnij na innych stronach

Potrzebujesz do poprawnego działania poprawnych UVek?

UV Set nie jest potrzebny do obliczenia punktów. Jako input plugin przyjmuje pozycje wierzchołków i ID wierzchołków tworzących trójkąty.

 

Jaką klasą są wyświetlane punkty?

Punkty wyświetlane są klasą mgDisplayPoints, lokator który napisałem do sprawdzania wyników.

 

Czy pobranie z pozycji punktu normalki face'a znacznie by wydłużyło czas obliczeń?

Obliczenie wektora normalnego dla sampli w bardzo niewielkim stopniu wydłuży obliczenia, czasy będą minimalnie większe. To będzie następna rzecz którą chciałbym się zająć, żeby narzędzie miało praktyczne zastosowanie. Zacząłem pisać ten plugin z myślą o narzędziu do rozprowadzania piór na obiekcie. Mam nadzieję że uda mi się stworzyć zestaw DG nołdów umożliwiających wygodną pracę z punktami w Maya.

 

W czym przydatne było wykorzystanie bibliotek CUDA? Obsługujesz wielowątkowość w swoim nodzie?

Większość obliczeń wykonuje się na karcie graficznej. W skrócie wygląda to tak: najpierw wysyłam dane obiektu na GPU (wierzchołki, ID wierzchołków które tworzą trójkąt), później losuje na tych trójkątach bardzo dużą ilość punktów uzyskując w ten sposób dyskretną reprezentacją powierzchni obiektu (zamiast trójkątów mam punkty na całej jego powierzchni). Losowanie punktów odbywa się wielowątkowo na karcie graficznej za pomocą bibliotek cuRAND. Później wybieram z tego zbioru punkty które są dostatecznie oddalone od siebie. Żeby tego dokonać muszę wylosowane punkty odpowiednio pogrupować: dzielę przestrzeń bounding boxa na komórki i przypisuję wylosowane punkty do komórek. Następnie grupuję komórki w ten sposób, żeby w danej grupie komórki były dostatecznie daleko od siebie, na tyle daleko, żeby punkty znajdujące się w tych komórkach nie mogły kolidować ze sobą. Teraz w grupach komórek mogę dokonać współbieżnego wybierania punktów. Pomocna tutaj okazała się biblioteka NVIDIA Thrust, która dostarcza takie mechanizmy jak współbieżne sortowanie.

 

Opis trochę zawoalowany jak sam algorytm ;-)

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności