Hardwarebeschleunigtes Zeichnen gekrümmter Formen

11

Wie zeichnet man schnell eine gekrümmte Form?

  • von "schnell" gehe ich davon aus, dass man so viel wie möglich Hardware-Einrichtungen nutzen sollte

  • Mit "gekrümmt" meine ich Grenzen, die entweder durch quadratische oder kubische Bezier-Kurven definiert sind

  • Mit "Form" meine ich entweder einen "fetten" Strich (dh mehr als 1 Pixel breit) oder ein mit geraden, ungeraden / nicht null gefüllten "2D-gekrümmten Polygon", möglicherweise mit Löchern (dh Buchstaben "O").

Ich frage, weil die mir bekannten Optionen mehrere Nachteile haben:

  • Triangulieren der Form und Senden an OpenGL - erledigt die schwierigste Arbeit auf der CPU und verwendet möglicherweise zu viele / wenige Dreiecke (dh verschwenderisch / grob)

  • Texturatlas - muss die Textur bei jeder Änderung neu berechnen / hochladen (Form, Skalierung, Drehung, ...)

  • Vorzeichenbehaftetes Distanzfeld - In großen Maßstäben sehen die Details nicht hübsch aus oder müssen die Textur neu berechnen / hochladen

  • NV_path_rendering - könnte es sein, wenn es nicht nur auf Nvidias Karten funktioniert

  • OpenVG - könnte es sein, wenn es nicht nur auf Mobilgeräten funktioniert

  • ?


* Es scheint mir, dass OpenVG nicht gerade vorwärts geht, um es milde auszudrücken. Weiß jemand etwas über seine Zukunftsaussichten? Lohnt es sich überhaupt, ein Auge auf die Gegenwart zu werfen?

** OpenGL 4+ bietet die Möglichkeit, Polygone im laufenden Betrieb zu tessellieren. Könnte es irgendwie verwendet werden, um das Netz aus der Option "Triangulieren" zu verfeinern, so dass die Formgrenze zumindest nicht "abgewinkelt" aussieht?

Ecir Hana
quelle
2
Diese GPU Gems Artikel rastern quadratische Kurven durch Teile des Rumpfes zu identifizieren , die gekrümmt sind und analytisch die Berichterstattung in dem Pixel - Shader - Berechnung, könnte einen Blick wert sein: developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch25.html
yuriks
2
@yuriks Ja, Loop & Blinn, total vergessen. Aber ist es nicht patentiert?
Ecir Hana
Siehe auch Massively-Parallel Vector Graphics , veröffentlicht in SIGGRAPH Asia 2014.
lhf
Ich denke, zwischen den Optionen, die Sie in Ihrer Frage aufgeführt haben, und dem Loop- und Blinn-Papier haben Sie alle Möglichkeiten ziemlich ausgeschöpft.
Nathan Reed
Sie können eine Linie wie hier beschrieben tessellieren . Oder Sie können in einem Compute-Shader triangulieren.
Nikitablack

Antworten:

2

Sie können OpenGl 4.x-Tessellations-Shader verwenden, um Bezier-Kontrollpunkte in Polygone umzuwandeln.

Bei einer Google-Suche nach "Tessellation Shader Bezier" wurde diese Gliederung gefunden, die die Tessellation von Bezier-Oberflächen und -Kurven beschreibt:

http://web.engr.oregonstate.edu/~mjb/cs519/Handouts/tessellation.1pp.pdf

Dies verlagert die Bezier-Auswertung von der CPU auf die GPU und reduziert den Datenfluss über den Bus.

atb
quelle
3
Sie können diese Antwort verbessern, indem Sie ein wenig näher darauf eingehen oder einfach nur auf etwas verweisen, das weiter erklärt.
Nathan Reed
1
Eine Möglichkeit, diese Antwort zu erweitern, besteht darin, die vom Autor erwähnten Nachteile zu beheben und zu erläutern, wie Ihr Ansatz dabei hilft.
Trichoplax
0

Mit Hardware kann man gekrümmt zeichnen. Es gibt eine Methode, die in beschrieben ist GPU Gems 3 , die beschreibt, wie dies gemacht wird. User @yuriks kommentiert dies tatsächlich. Ich habe tatsächlich schnell eine schmutzige Demo erstellt, die Sie sich ansehen können.

Kurve

Bild 1 : HW-beschleunigte Kurvenformung (gezeichnet unter Verwendung eines Dreiecks) und Webgl-Quelle

joojaa
quelle