Abdeckung - Fehler im Algorithmus - wie kann man seine Verwendung loswerden?

10

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.

Geben Sie hier die Bildbeschreibung ein

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.

joojaa
quelle
Füge Bilder für mein Amnendum hinzu, sobald mein Arbeitstag vorbei ist. Nachdem dies alles Grafikverarbeitung ist, hat es eine visuelle Interpretation
joojaa

Antworten:

6

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.

Doc Brown
quelle
Sie müssen die Samples nicht speichern. Sie müssen lediglich das Rasterisierungssetup speichern. Die abdeckungsbasierte Methode speichert sie auch nicht, sodass dies kein Rückschritt ist. Die naive Methode wird nur vorgestellt, weil sie leicht zu verstehen ist und Sie problemlos prioritätsbasierte Stichproben erstellen können. Auch wenn Sie Ihre abdeckungsbasierten Lösungen auf die GPU verschieben möchten, müssen Sie viel zusätzliche Arbeit leisten und sind mit dem Modell nicht kompatibel.
Jojaja
@joojaa: Können Sie skizzieren, was Sie unter "Speichern des Rasterisierungs-Setups" verstehen, oder einen Link angeben, in dem der Ansatz so erklärt wird, dass man sich nicht in einem> 20-seitigen wissenschaftlichen Artikel umsehen muss?
Doc Brown
Jedes Pixel ist unabhängig voneinander, sodass Sie die Samples nur speichern müssen, während Sie das Pixel erstellen. Danach können Sie sie sicher verwerfen. Wenn Sie einen Fiter höherer Ordnung verwenden möchten, können Sie nur eine eingeschränkte Ansicht speichern. Alles, was Sie wirklich tun müssen, ist Speicher für Ihren Verarbeitungskern zuzuweisen, also vielleicht (16-256 Bytes pro Thread)
joojaa
Oh, tut mir leid, Sie müssen nicht einmal die Proben speichern, wenn Sie eine Box-Filterung durchführen. Sie können einfach die Formel für den gleitenden / laufenden Durchschnitt verwenden, bei der Sie keine einzelnen Proben speichern müssen
joojaa
@joojaa: Ich verstehe es nicht - nicht Sie müssen die Proben zunächst berechnen alle verwandten Formen , vielleicht Hunderte oder Tausende, und danach auf dem Raster - Anzeige filtern nach unten?
Doc Brown
6

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,

Martin Kochanski
quelle
Dies ist ein Problem der Deckungsberechnung. Wenn mein Supersampling KEINE Deckungsberechnung durchführt, hat es keine Probleme, da es zur richtigen Antwort konvergiert und das Problem nicht nur verringert. Benötigen Sie einen Code, um dies zu beweisen? So funktioniert Ihre Grafikkarte und dieses Problem tritt nicht auf. Andernfalls würde jedes Spiel, das Sie sehen, das Problem aufweisen. Ich kaufe diese Antwort nicht, da sie auf falscher Logik basiert.
Joojaa
@ joojaa-Spiele führen entweder kein Anti-Aliasing durch oder verwenden Super-Sampling für das Anti-Aliasing, das normalerweise vier Anti-Aliasing-Stufen bietet. Dies ist nicht gut genug für Grafiken in Präsentationsqualität, bei denen Sie ungefähr 64 Stufen für Anti-Aliasing wünschen. Spiele tauschen also das eine Problem gegen ein anderes aus.
Pete Kirkham
@PeteKirkham hängt von Ihrer Einstellung ab. In einigen Spielen können Sie Stichprobenbeträge angeben. Auf jeden Fall benötigen Sie nicht mehr als 16 Samples, um die Präsentationsstufe AA zu erzeugen, wenn Sie einen Filter höherer Ordnung als die Boxfilterung verwenden. Beachten Sie, dass das Bild ohne Fehler in meinem Beispiel durch Supersampling im Hardware-Reasterizer erstellt wird.
Jojaja