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.
quelle
Antworten:
Supersampling ist, wenn es naiv durchgeführt wird, rechenintensiv, da Sie, wenn Sie beispielsweise die Hälfte der Pixelgröße Ihres Displays verwenden, das Vierfache des Speichers und der Bandbreite benötigen. Wikipedia erwähnt dies und nennt adaptives Supersampling als mögliche Lösung. Dies macht den Algorithmus jedoch viel ausgefeilter, komplexer und schwieriger zu implementieren.
Und ich denke, das ist der Grund, nach dem Sie suchen: Wenn Sie einen Algorithmus suchen, der nicht viel mehr Speicher und Laufzeit benötigt, werden die Dinge viel komplizierter als beim naiven "Transparenz" -Ansatz.
quelle
Supersampling löst das Problem im Allgemeinen nicht: Es macht es lediglich weniger auffällig. Bei halb so großen Pixeln ist das Problem halb so auffällig, aber es verschwindet nicht.
Der architektonische Punkt hinter diesen Entwürfen ist, dass der Befehl "Dreieck ABC rendern" eine bestimmte Bedeutung haben soll. Wir möchten nicht, dass es mehrdeutig ist, es sei denn, es wird als Teil einer Sammlung von Zeichenbefehlen betrachtet. Beispielsweise hat es eine Bedeutung, wenn "Dreiecks-BCD rendern" ebenfalls in der Sammlung enthalten ist (mit derselben oder einer anderen Farbe) und eine andere Bedeutung, wenn es ist nicht.
Wenn man zum Beispiel tausend Dreiecke betrachtet, ist es rechenintensiv, alle Dreiecke zu finden, die eine Seite oder einen Teil einer Seite mit ABC teilen (man muss sich daran erinnern, dass dies tausendmal wiederholt werden muss). Es gibt noch viele andere praktische Probleme: Insbesondere müssen alle ursprünglichen Rendering-Anforderungen beibehalten werden, auch wenn sie vor langer Zeit gezeichnet wurden, falls sie aufgrund einer neuen, zusätzlichen Anforderung neu bewertet werden müssen.
Das Fazit ist, dass eine perfekt konsistente Lösung nicht praktikabel ist. Es bleibt die Frage: Sollten wir versuchen, die aktuelle Situation zu verbessern, wenn wir können? Im Allgemeinen lautet die Antwort auf diese Frage Nein. Eine perfekt konsistente Implementierung eines Modells ist immer besser, auch wenn das Modell selbst die von Ihnen dargestellten Einschränkungen aufweist. Die Alternative wäre eine Implementierung, die manchmal besser und manchmal nicht funktioniert, ohne dass der Programmierer wissen kann, welche dieser beiden in einem bestimmten Fall gelten wird. Darüber hinaus kann es aufgrund winziger Änderungen, die vom Programmierer vorgenommen wurden - oder sogar aufgrund von Änderungen, die außerhalb der Kontrolle des Programmierers liegen - von "besser machen" zu "nicht besser machen" springen. Vorhersagbarkeit in einem Programmierkontext ist weit,
quelle