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.
texture
bitmap-graphics
vector-graphics
performance
Ethan Bierlein
quelle
quelle
Antworten:
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)
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:
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.
quelle
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.
quelle
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.
quelle