Jak szybko narysować zakrzywiony kształt?
przez „szybko” Zakładam, że należy w jak największym stopniu korzystać ze sprzętu
„zakrzywione” mam na myśli granice zdefiniowane przez kwadratowe lub sześcienne krzywe Beziera
przez „kształt” rozumiem albo „gruby” skok (tj. szerszy niż 1px szerokości) albo parzysty nieparzysty / wypełniony niezerowo „zakrzywiony wielokąt 2D”, ewentualnie z dziurami (tj. literą „O”)
Pytam, ponieważ znane mi opcje mają kilka wad:
triangulowanie kształtu i wysyłanie go do OpenGL - wykonuje najtrudniejszą pracę na procesorze i może wykorzystywać zbyt wiele / kilka trójkątów (tj. marnotrawstwo / zgrubne)
atlas tekstur - musi ponownie obliczyć / załadować teksturę przy każdej zmianie (kształt, skala, obrót, ...)
Podpisane pole odległości - na dużych skalach szczegóły nie wyglądają ładnie lub muszą ponownie obliczyć / załadować teksturę
NV_path_rendering - może tak być, gdyby nie działał tylko na kartach Nvidii
OpenVG - może tak być, gdyby nie działał tylko na urządzeniach mobilnych
?
* Wydaje mi się, że OpenVG nie idzie dokładnie do przodu, delikatnie mówiąc. Czy ktoś wie coś o jego przyszłych perspektywach? Czy w ogóle warto mieć oko na współczesność?
** OpenGL 4+ zapewnia teselację wielokątów w locie. Czy można go w jakiś sposób wykorzystać do udoskonalenia siatki z opcji „triangulacji”, tak aby granica kształtu przynajmniej nie wyglądała „pod kątem”?
źródło
Odpowiedzi:
Za pomocą modułów cieniowania teselacji OpenGl 4.x można konwertować punkty kontrolne Beziera na wielokąty.
Wyszukiwarka Google dla „tesselacji modułu cieniującego bezier” znalazła ten zarys opisujący teselację powierzchni i krzywych Beziera:
http://web.engr.oregonstate.edu/~mjb/cs519/Handouts/tessellation.1pp.pdf
To odciąża ocenę Beziera od CPU do GPU i zmniejsza przepływ danych przez magistralę.
źródło
Rysowanie zakrzywione można wykonać za pomocą sprzętu. Istnieje metoda opisana w GPU Gems 3, która opisuje, jak to zrobić. Użytkownik @yuriks komentuje to. Zrobiłem szybkie, brudne demo, abyś mógł na nie spojrzeć.
Zdjęcie 1 : Shapen krzywej przyspieszonej HW (narysowany jako trójkąt) i źródło webgl
źródło