Jump to content

Parallel Poisson Disk Sampling with Spectrum Analysis on Surfaces


Obywatel
 Share

Recommended Posts

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Guest 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ą :)

Edited by User190
Link to comment
Share on other sites

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 ;-)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

We are using cookies. Read about our Privacy Policy