Przyspieszane sprzętowo rysowanie zakrzywionych kształtów

11

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”?

Ecir Hana
źródło
2
Ten artykuł na temat klejnotów GPU rasteryzuje krzywe kwadratowe, identyfikując części kadłuba, które są zakrzywione i obliczając analitycznie pokrycie w module cieniującym piksele, może być warte obejrzenia: developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch25.html
yuriks
2
@yuriks Tak, Loop & Blinn, zupełnie o tym zapomniałem. Ale czy to nie jest opatentowane?
Ecir Hana,
Zobacz także grafikę wektorową o
masywnej
Pomiędzy opcjami wymienionymi w pytaniu a artykułem Loop i Blinn, wydaje mi się, że wyczerpałeś wszystkie możliwości.
Nathan Reed,
Możesz teselować linię, jak opisano tutaj . Lub możesz triangulować w module obliczeniowym.
nikitablack,

Odpowiedzi:

2

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ę.

atb
źródło
3
Możesz poprawić tę odpowiedź, opracowując ją trochę, a nawet łącząc się z czymś, co wyjaśnia dalej.
Nathan Reed,
1
Jednym ze sposobów rozszerzenia tej odpowiedzi byłoby wyeliminowanie wad wspomnianych przez autora i wyjaśnienie, w jaki sposób podejście pomaga w ich rozwiązaniu.
trichoplax
0

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ć.

krzywa

Zdjęcie 1 : Shapen krzywej przyspieszonej HW (narysowany jako trójkąt) i źródło webgl

joojaa
źródło