Einführung
Viele der Rendering-Engines für Hauptvektorgrafiken weisen einen algorithmischen Fehler auf. Sie rendern jede Form einzeln und Antialien, indem sie die Pixelabdeckung berechnen und sie dann übereinander zusammensetzen. Ja, es ist einfach, aber die richtigen Lösungen sind noch einfacher.
Dies führt zu einem Konfliktproblem, da die Abdeckung durch Transparenz zusammengeführt wird. Die Alpha-Überblendung folgt einer Regel, die die Situation nicht genau wiedergibt. Nehmen Sie beispielsweise ein Pixel, das zu 50% abgedeckt ist und einem Pixel benachbart ist, das ebenfalls zu 50% komplementär abgedeckt ist. Dies führt nicht zu einer Abdeckung von 100%, sondern zu einer Abdeckung von 75% . Wie dies aussieht, hängt davon ab, wie der Algorithmus eingestellt ist und von anderen Details. Im Wesentlichen handelt es sich jedoch um einen bekannten Fehler. Jemand ging Trog sogar die Mühe , die verschiedenen dokumentiert Motor Fehler zusammen mit einem Papier zeigt , das Schreiben , wie es besser gemacht werden könnte.
Bild 1 : Völlig nicht repräsentatives Beispiel für das Rendern einer Form aus Dreiecken mit vergrößertem Fehler in der oberen Reihe. SVG-Quelle
Das Problem hat eine einfache naive Lösung * nur super Probe ohne Deckungsberechnung und filtern Sie das Bild nach unten. Als Bonus können Sie bessere Bildrekonstruktionsalgorithmen als die Boxfilterung verwenden (lesen Sie A Pixel ist kein Quadrat 3 ). Es gibt sogar Lösungen mit vergleichbarer Geschwindigkeit wie aktuelle Lösungen, und diese Lösungen sind in Hardware-Rasterisierungs-Pipelines viel einfacher durchzuführen (und Sie sehen diesen Fehler auf der GPU selten, da er nur dieses Problem vermeidet).
Dies ist auch kein Problem ohne Kosten. Es gibt viele Leute, die im Grafikdesign arbeiten und nicht trivial viel Zeit damit verbringen, dieses Problem manuell zu umgehen, indem sie sicherstellen, dass es hier Überlappungen gibt und dort keine Überlappungen, um das Problem zu beheben, das der Computer für sie tun sollte. Und in vielen Fällen spektakulär versagen. Aber ihren Kunden ist es egal, warum der Fehler da ist, sie müssen ihn beheben.
Frage
Wie verbreitet sich der Fehler? Da sie alle den gleichen Fehler machen, könnte man schließen, dass sie die gleiche Quelle für ihren Algorithmus verwenden. Was könnte die Designer veranlasst haben, diesen Algorithmus zu wählen? Warum haben nur die 3D-Programmierer diesen Fehler erkannt und sogar seinen Teil in ihren APIs und im Unterricht kodifiziert, während 2D-Programmierer dies nicht taten?
Wie kann sichergestellt werden, dass sich dieser Fehler nicht weiter ausbreitet?
Nachtrag (aber ich frage nicht danach)
* Anscheinend ist meine Behauptung, dass Super Sampling fehlerfrei funktioniert, außergewöhnlich und erfordert außergewöhnliche Beweise. Ok, der Schlüssel zum Arbeiten mit Super-Sampling ist also, dass das Super-Sampling keine Coverage-Verarbeitung durchführt. Im Wesentlichen behandelt der Super-Sampler jede Probe als Punktprobe. Da die Punktstichprobe keine Annahme des zugrunde liegenden Bereichs macht, verursacht sie keinen Alpha-Vergleich, wenn dies nicht der Fall ist.
Damit es konsistent funktioniert, wie in einer der Antworten beschrieben. Wir müssen dafür sorgen, dass die Stichproben aus Gründen der Konsistenz mit ganzzahligen Stichproben verarbeitet werden. Dies stellt sicher, dass jeder Punkt, der einmal in den Bildschirmbereich transformiert wurde, genau die gleiche Lösung für gleiche Koordinaten erhält und dass keine Probe zweimal durch einen Pixelrand schattiert wird. Um dies zu tun, kann es sein, dass ein Sample kein Pixel auslöst oder nicht genau aktiviert ist, wenn es sich beispielsweise um das Sample auf der linken Seite unten handelt (daher legen wir die Regel fest, dass exakte Kanten in> vs <= verarbeitet werden). Alle bis auf eine Konsolengrafikkarte funktionieren so. Es stellt sicher, dass keine zusätzlichen Daten zwischengespeichert werden müssen und keine zusätzlichen Tests in der Nähe durchgeführt werden müssen. Diese Lösung ist genauso stabil, allgemeiner und konsistenter als abdeckungsbasierte Lösungen.
Der Algorithmus ist genau der gleiche wie das Original mit etwas weniger Code und etwas mehr Samples. Es ist daher genauso konsistent, wenn nicht mehr als der abdeckungsbasierte Algorithmus. Wir wissen das, weil wir solche Methoden seit Ewigkeiten in fast allen anderen Bereichen der Signalverarbeitung sowie bei Grafikkarten anwenden.
Hat diese Methode also einen Nachteil? Nun, es ist ein bisschen langsamer, wenn Sie nur eine naive Annahme machen würden. Es hat theoretisch ein schnelleres asymptotisches Verhalten als der Coverage-Rasterizer, ähnlich wie ein Raytracer ist es in typischen Szenen immer noch nur auf Augenhöhe. Außerdem könnte die Implementierung faltungsbasierter Effekte schmerzhafter zu implementieren sein.