• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SFML - particle system akcelerowany CUDA'ą

Object Storage Arubacloud
0 głosów
273 wizyt
pytanie zadane 2 lutego 2019 w C i C++ przez Maciej Złotorowicz Gaduła (4,230 p.)
Dzień Dobry. Chcę zacząć robić własny system particlie system akcelerowany GPU. Rozmyślając jak ja wgl chcę to zrobić natknąłem się na problem - jeżeli na GPU policzę pozycje, kolor itd każdego particla (dajmy na to że będzie ich milion) i potem będę to wszystko kopiował do cpu tylko po to by za chwile użyć milion razy draw mija się z celem. i teraz mam takie pytanie. Jak to zrobić lepiej? miałem inny pomysł by jedna funkcja GPU liczyła pozycje particli a druga wywołana tuż po obliczeniach rasteryzowała je na teksturze która potem by była w całości wyświetlona (ale to jest trochę nie elastyczne). Może wy macie jakieś doświadczenia z rysowaniem tak wielu obiektów na raz? jak to zrobić szybko? (chcę użyć jedynie CUDY i SFML'a)

1 odpowiedź

+2 głosów
odpowiedź 2 lutego 2019 przez criss Mędrzec (172,590 p.)
wybrane 2 lutego 2019 przez Maciej Złotorowicz
 
Najlepsza

Przede wszystkim: daj sobie spokój z SFML. Będzie cie tylko ograniczać. Poza tym - SFML to wysokopoziomowa nakładka na OpenGL , a CUDA to jeszcze kolejne API. Bardzo sobie komplikujesz mieszając dwa różne API. Szczerze, to nie wiem jak tu wyglądają możliwości, ale na pewno bardzo utrudnia sprawe i całkiem możliwe, że to nakłada spadek wydajności i/lub konieczność dodatkowej synchronizacji. Plus myślę, że mogę być całkiem pewien, że z abstrakcją jaką ci robi SFML nawet nie ma szans, chyba że zamierzasz użyć SFML tylko do kreacji contextu (chociaż nie wiem czy w ogóle potrafi tworzyć core profile context).
tl;dr: odradzam mieszać graphics api przyanjmniej na początku nauki i polecam pozbyć się SFML

jeżeli na GPU policzę pozycje, kolor itd każdego particla (dajmy na to że będzie ich milion) i potem będę to wszystko kopiował do cpu tylko po to by za chwile użyć milion razy draw mija się z celem. i teraz mam takie pytanie. Jak to zrobić lepiej?

Nie ma potrzeby kopiowania do cpumem skoro GPU zarówno liczy ruch jak i rysuje. Wszystko powinno się dziać w gpumem. No i nie ma żadnego milion razy draw (podejrzewam, że tutaj myślisz o SFML?). Dlatego mówię, żebyś wyrzucił SFML, tylko korzystał z OpenGL 4.5 core profile które teraz oferuje naprawdę dużo - nawet nie ma potrzeby wspomagania się CUDA, bo masz compute shader (chociaż zgadzam się, że CUDA jest przyjemniejsza).

Może wy macie jakieś doświadczenia z rysowaniem tak wielu obiektów na raz?

Wszytkie particle rysujesz jako jeden mesh z primitivem GL_POINTS. I to jest jeden drawcall. Jak to się z reguły robi: masz buffer (tj. jakaś alokacja gpumem) z pozycjami miliona particli. Za pomocą compute shader (albo CUDA jeśli już musisz i ogarniesz jak to się robi) modyfikujesz pozycje (możesz mieć jeszcze jeden buffer np. z prędkością). Tutaj (między compute a draw) potrzebujesz sync call z odpowiednią flagą - w OpenGL glMemoryBarrier. Rysujesz to za pomocą glDrawArrays, ale geometry shader z każdego takiego punkcika robi 4 jako triangle_strip - tzn prostokąt. Teraz ten kwadrat możesz już sobie teksturować, kolorować czy cokolwiek chcesz. I tak w kółko. To w dużym skrócie - musisz znać wiele szczegółow, ale generalnie to nie jest nic trudnego, poradzisz sobie. https://www.3dgep.com/opengl-interoperability-with-cuda/

miałem inny pomysł by jedna funkcja GPU liczyła pozycje particli a druga wywołana tuż po obliczeniach rasteryzowała je na teksturze która potem by była w całości wyświetlona

Tak, dokładnie tak powinna wyglądać pętla.

Jako reference: https://github.com/Crisspl/GPU-particle-system kiedyś zrobiłem coś bardzo podobnego, może ci się przydać jako odniesienie jakieś. Kod bezpośrednio do particli jest w particles/main.cpp. PS: jak teraz patrze to flaga w glMemoryBarrier jest skopana, nie sugeruj się tym :P 

komentarz 2 lutego 2019 przez Maciej Złotorowicz Gaduła (4,230 p.)
chyba mi się openGL będzie śnił po nocach :D Nie ukrywam że SFML mi się spodobał i korzystam głównie z niego i możliwe że jest to dla mnie ograniczenie.. Chyba pora przejść na bardziej zaawansowane API. Dokończę ten projekt jeszcze z "moimi" narzędziami i biorę się za openGL (a może dx11?) Dzięki za odpowiedź.

Podobne pytania

0 głosów
1 odpowiedź 970 wizyt
pytanie zadane 15 kwietnia 2017 w C i C++ przez Alvancaran Dyskutant (8,160 p.)
0 głosów
0 odpowiedzi 109 wizyt
pytanie zadane 15 marca 2020 w JavaScript przez bergman Obywatel (1,600 p.)
0 głosów
1 odpowiedź 139 wizyt
pytanie zadane 3 marca w Sprzęt komputerowy przez gsekulski Użytkownik (800 p.)

92,555 zapytań

141,403 odpowiedzi

319,553 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...