Leistung von Vektorgrafiken im Vergleich zu Bitmap- oder Rastergrafiken

20

Manchmal verwende ich Vektorgrafiken, einfach weil sie in einigen Fällen nur ein bisschen schöner aussehen , und manchmal verwende ich Bitmap- / Raster-Grafiken.

Ich habe mich gefragt, ob es signifikante Leistungsunterschiede zwischen diesen beiden Optionen gibt.

Ethan Bierlein
quelle
6
Wirklich, es hängt von vielen Faktoren ab. NVIDIA bietet Hardwarebeschleunigung für Vektorgrafiken. Hast du es gesehen? developer.nvidia.com/nv-path-rendering-videos
TheBuzzSaw

Antworten:

15

Wie TheBuzzSaw sagte, hängt es von vielen Dingen ab, einschließlich der Implementierung der gerasterten Grafiken gegenüber den Vektorgrafiken.

Im Folgenden finden Sie einige leistungsstarke Vektorgrafiken, die mit herkömmlichen Rastermethoden gerendert werden.

Loop und Blinn zeigen, wie Sie eine quadratische Bézier-Kurve für Vektorgrafiken rendern, indem Sie ein einzelnes Dreieck rendern und anhand der Texturkoordinaten in einem Pixel-Shader feststellen, ob sich ein Pixel über oder unter der Kurve befindet: http: //www.msr-waypoint. net / de-de / um / people / cloop / LoopBlinn05.pdf

Die Grundidee ist, dass Sie Ihre Dreiecks-Eckpositionen auf die 3 Kontrollpunktpositionen setzen und die Texturkoordinaten an jeder Ecke auf (0,0), (0,5,0) bzw. (1,1) setzen. Wenn in Ihrem Shader die interpolierte Texturkoordinate (x * xy) <0 ist, befindet sich das Pixel unterhalb der Kurve, ansonsten oberhalb der Kurve.

Sie können eine faux Implementierung auf Shadertoy hier sehen: https://www.shadertoy.com/view/4tj3Dy

Bei der zweiten Methode von Valve werden Abstände zu einer Form in einer Textur anstelle von Pixeldaten gespeichert, sodass Vektorgrafiken mithilfe von Texturabtastungen gezeichnet werden können. Die Dekodierung ist so einfach, dass sie sogar mit einem Alphatest auf Hardware mit festen Funktionen implementiert werden kann! http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf

Um Ihnen eine Vorstellung davon zu geben, wie gut die zweite Technik funktioniert, wurde dieses 1024x768-Schnurrbartbild aus einem 64x32-Quellbild mit einem einzigen Farbkanal generiert! (aka 2KB unkomprimiert)

Bildbeschreibung hier eingeben

Ich habe auch einige Dinge darüber in meinem Blog geschrieben: http://blog.demofox.org/2014/06/30/distance-field-textures/

Hier ist ein OpenCL-Beispielcode, der zeigt, wie einfach es ist:

float alpha = read_imagef(tex3dIn, g_textureSampler, textureCoords).w;
float3 color = (alpha < 0.5f) ? (float3)(1.0f) : (float3)(0.0f);

Beide Techniken sind superschnell und verwischen die Grenze zwischen Vektor- und gerasterten Grafiken ein wenig. Sie werden mithilfe von Rastertechniken gerendert, haben jedoch Zoom- / Skalierungseigenschaften wie Vektorgrafiktechniken.

Alan Wolfe
quelle
1
Siehe auch ventilsoftware.com/publications/2007/…
Internet wird
Ja, das ist eine sehr coole Technik, das ist die zweite Technik, die ich erwähnt habe, und ich verweise auch auf dasselbe PDF oben.
Alan Wolfe
Woops, habe es verpasst, sorry.
Internet besteht aus Catz
1
Eine adaptive Lösung für das Kanten-Anti-Aliasing von Distanzfeldern finden Sie hier: essentialmath.com/blog/?p=151 .
Jim Van Verth
8

Es könnte geben.

Weniger technische Antwort:

Wenn Sie eine Website oder eine andere Anwendung erstellen, bei der Sie nichts mit der Grafikprogrammierung zu tun haben, lautet die Antwort wahrscheinlich Ja. Die zugrunde liegenden APIs versuchen zu erraten, wie sie gerendert und effizient zwischengespeichert werden können. Da Ihre Anwendung jedoch ausgeführt wird und die API manchmal falsch vermutet, muss sie möglicherweise die Elemente neu rendern und die Leistung beeinträchtigen.

Technischer:

Denken Sie daran, dass alle Bitmap-Texturen von der GPU gerendert werden, es sei denn, Sie verwenden eine der neuesten GPUs und eine Bibliothek zum Zeichnen der Vektorpfade auf der GPU.

Ich werde den typischen Fall betrachten, in dem Vektorgrafiken in Texturen gerendert werden. Hier hängt die Leistung von Ihrer Toolchain ab, ob Ihre Anwendung dynamisch Texturen aus den Vektorassets erstellt und ob die Grafiken in verschiedenen Zoomstufen angezeigt werden. Es gibt zwei Probleme: Ressourcen und Texturgenerierung. Wenn Sie die Grafiken nur in einer statischen Größe anzeigen, gibt es wahrscheinlich keinen Unterschied, und Ihre Toolchain kann die Elemente vor der Laufzeit in Bitmap-Grafiken konvertieren. Wenn sie jedoch in verschiedenen Größen oder in einer 3D-Welt angezeigt werden, benötigen Sie mip-abgebildete Texturen, die mehr Speicherplatz beanspruchen. Sie nehmen viel Speicherplatz in Anspruch, wenn Sie ihre Wiedergabetreue wirklich aus nächster Nähe mit einer größeren Textur sehen möchten.

Ich hoffe das hilft.

ShaneC
quelle
6

Es gibt verschiedene Möglichkeiten, Vektorgrafiken wiederzugeben. Wie TheBuzzSaw erwähnt, verfügt NVIDIA über eine Erweiterung, mit der allgemeine Pfade recht schnell gerendert werden können (dies funktioniert jedoch nur mit NVIDIA-GPUs). Alan Wolfe erwähnt die impliziten Oberflächenmethoden (Loop-Blinn / Distanz-Felder), die eine Funktion definieren, die angibt, ob Sie sich innerhalb oder außerhalb einer Form befinden, und die darauf basierenden Pixel färbt. Eine andere Methode ist Stencil-and-Cover, bei der Sie den Pfad in einen Schablonenpuffer rendern und anhand der geraden und ungeraden Anzahl bestimmen, ob der Pfad ein Pixel abdeckt.

Im Allgemeinen ergibt sich jedoch der Nachteil, dass das Rendern von Rastern schneller, jedoch anfälliger für Aliasing ist (selbst Distanzfelder brechen bei niedrigen und hohen Maßstäben zusammen). Das Rendern von Pfaden erfordert viel Setup, kann jedoch theoretisch auf jede Auflösung skaliert werden.

Jim Van Verth
quelle