Wie berechne ich die Abdeckung überlappender analytischer Kurven genau?

10

Beim Antialiasing von 2D-Formen wird der Bruchteil eines Pixels berechnet, der von der Form abgedeckt wird. Für einfache, nicht überlappende Formen ist dies nicht allzu schwierig: Schneiden Sie die Form gegen das Pixelrechteck und berechnen Sie die Fläche der resultierenden Form. Es wird jedoch schwieriger, wenn mehrere Formen dasselbe Pixel überlappen. Das einfache Summieren von Bereichen kann dazu führen, dass die berechnete Abdeckung zu hoch ist, wenn der Betrag vernachlässigt wird, in dem eine Form eine andere Form abdeckt. Weitere Informationen zum Rendern von Schriftarten finden Sie beispielsweise im Abschnitt Einschränkungen dieses Artikels . Möglicherweise befinden Sie sich auch in einer Situation, in der die beiden Kurven von unterschiedlichen Objekten mit unterschiedlichen Farben stammen (es geht also nicht um die Gesamtabdeckung für die Vereinigung der beiden Formen, sondern um die Abdeckung jeder einzelnen Form).

Wie würde dies berechnet, wenn Sie sich um vollständige Genauigkeit kümmern würden? Noch schwieriger ist es, die Abdeckung für überlappende nicht polygonale Formen wie Kurven genau zu berechnen. Gibt es einen Punkt, an dem Sie keine andere Wahl haben, als auf Multisampling- oder stochastische Techniken zurückzugreifen?

John Calsbeek
quelle

Antworten:

10

Es gibt wirklich keine gute Möglichkeit, dies für alle Eckfälle effizient analytisch durchzuführen. Die meisten oder alle kommerziellen 2D-Renderer, die versuchen, eine analytische Abdeckungsberechnung durchzuführen, machen vorhersehbare Fehler, die Multisampling-Methoden nicht machen.

Ein typisches Problem sind zwei überlappende Formen, die dieselbe Kante haben. Die übliche Situation ist, dass Alpha-Kanäle zu einer zu dicken Alpha-Kante summieren, die leicht aliasiert. Oder wenn Formen unterschiedlich gefärbt sind, verwirrt das System, welche Farbe der Hintergrund hat. Das ist extrem nervig.

Bild

Bild 1 : Die Rendering-Engine verwirrt die Abdeckung und erstellt einen dünnen weißen Umriss, wo kein Umriss sein sollte.

Die zweite perfekte Abdeckung entspricht der Boxfilterung. Wir können es sicherlich besser machen. In Anbetracht der Tatsache, dass es so viele spezielle Eckfälle gibt, die boolesche Operationen an den Formen erfordern würden, um richtig zu arbeiten, ist die Super-Abtastung immer noch überlegen. Tatsächlich können die Abdeckungsschätzungen verwendet werden, um die Probenahme dort zu konzentrieren, wo sie am wahrscheinlichsten benötigt wird.

Die Situation könnte zu Polygonen auf Subpixel-Ebene vereinfacht werden, dann könnte die diskrete analytische Lösung gelöst werden. Dies jedoch auf Kosten der Flexibilität. Zum Beispiel ist es nicht ausgeschlossen, dass zukünftige Vektorsysteme unscharfe Linien mit variabler Breite zulassen möchten, die ein Problem für analytische Lösungen darstellen, ebenso wie andere variabel gefärbte Objekte.

Wie man es analytisch macht

Analytische Szene

Bild 2 : Angenommen, Sie haben diese Szene, Explosionsansicht rechts

Jetzt können Sie dies nicht nur analytisch tun, sondern jedes Stück einzeln und dann die Daten zusammenführen. Weil es zu falschen Daten führt. Wenn Sie dies tun, lässt das Alpha-Blending das Blau durch die Lücken leuchten.

Was Sie dazu tun müssen, ist die Szene so aufzuteilen, dass jede Form das beseitigt, was sich unter der anderen befindet:

Geben Sie hier die Bildbeschreibung ein

Bild 3 : Sie müssen die darunter liegenden Oberflächen schneiden.

Wenn nun alles undurchsichtig ist, ist alles einfach. Berechnen Sie einfach die Fläche jedes Stücks und multiplizieren Sie diese mit der Farbe und addieren Sie sie. Jetzt können Sie so etwas wie verwenden diese .

Dies alles bricht zusammen, wenn Ihre individuellen Formen natürlich nicht undurchsichtig sind, aber selbst das kann auf einer bestimmten Ebene getan werden.

Merken:

  • Die AA-Berechnung muss im linearen Farbraum durchgeführt und wieder in den verwendeten Raum konvertiert werden.
joojaa
quelle
Sagen wir, dass uns Effizienz nicht so wichtig ist. Wie würden wir Deckungsberechnungen für boolesche Operationen an Formen durchführen? Ist das generell oder nur für bestimmte Formen möglich?
John Calsbeek
@ JohnCalsbeek ok ich fange an, die analytische Antwort zu erstellen, es wird eine Weile
dauern