Umgang mit projektivem Aliasing in der Schattenzuordnung

15

Ich spiele mit einfachen prozeduralen 3D-Modellen, um kleine Gebäude für den 3D-Druck zu erstellen. Ein Beispiel:

Das Gebäude


Um die Modelle auf dem Bildschirm besser lesbar zu machen, habe ich eine grundlegende Schattenzuordnung für ein einzelnes gerichtetes Licht implementiert. Da sich meine Szene nicht ändert, rendere ich die Schattenkarte nur einmal mithilfe eines an der Achse ausgerichteten Felds der Szene, um die Grenzen der Schattenkarte zu bestimmen. Die Schatten und Grenzen sehen aus, als hätte ich alle Matrizen richtig, aber ein bisschen näher heranzukommen sieht schrecklich aus:

Nahaufnahme des Turms

Nach der Lektüre, die ich gemacht habe, verstehe ich das Peter-Panning und was ich dagegen tun könnte, aber die ausgefransten Kanten, von denen ich glaube, dass sie eine Form von projektivem Aliasing sind, sehen so schlecht aus, dass ich denke, dass etwas in meiner grundlegenden Implementierung nicht stimmt.

Ich habe den Pixel-Shader gehackt, um die Grenzen des Schattentexels anzuzeigen:

Texel-Grenzen anzeigen

Ich habe bilineare Filterung in der Textur (ohne diese bekomme ich ernsthafte Schattenakne). Leider ist mein PCF-Versuch auch gescheitert - es sieht genauso zerlumpt aus:

Bildbeschreibung hier eingeben

Hier ist der Einzelfall mit deaktivierter bilinearer Filterung:

Bildbeschreibung hier eingeben

Erscheint dies als "typisches" projektives Aliasing? Könnte das Problem durch dynamisches Rendern der Schattenkarte unter Verwendung des auf die Szene beschränkten Ansichtsstumpfs, möglicherweise durch Kaskadierung, behoben werden?

Bearbeiten: Hinzufügen einer Nahaufnahme der bilinearen Filterung, Post Shadow Vergleich, nur um zu zeigen, was ich bekomme. Schlechte Schattenakne tritt wegen der inneren Kanten auf; Ich modelliere mit gestapelten virtuellen Blöcken und führe keine ordnungsgemäße Gewerkschaftsoperation aus. Nach meiner Lektüre ist das Implementieren von Booleschen Operationen auf Polyedern nicht trivial, aber ich kann auch statische Schattenvolumina implementieren und einige 3D-Drucksoftware bereinigen.

Bilineare Filterung

Daniel M Gessel
quelle

Antworten:

10

Shadow Mapping mit akzeptabler Qualität ist eine ziemliche Reise. Sie haben also den ersten Schritt implementiert - eine einfache Schattenkarte, die die gesamte Szene statisch umfasst. Dies bedeutet, dass die Texelgröße der Schattenkarte im Bereich der hellen Ansicht im Verhältnis zur Texelgröße der gerenderten Szene im Bereich der Kameraansicht ziemlich groß ist, was zu einem Aliasing führt. Um dieses Verhältnis näher an 1: 1 zu reduzieren, gibt es Techniken, die Sie wie folgt erwähnt haben:

  • Der einfachste Weg ist die Vergrößerung Ihrer Schattenkarte, um den Wert mit noch optimaler Leistung zu finden.
  • Richten Sie die Schattenkarte an der Kameraansicht aus. Dann umfasst die Schattenkarte einen kleineren Teil der Szene, sodass das Aliasing reduziert wird.
  • Dies kann zu CSM verbessert werden, was dasselbe bewirkt, aber Sie müssen die Szene für jede der Kaskaden mit unterschiedlicher Mittelposition der Lichtsichtmatrix basierend auf dem Mittelpunkt jeder Kegelstumpfscheibe rendern.

Einige der grundlegenden Techniken zum Glätten der Schattenkante:

  • offensichtlich PCF, aber es wird empfohlen, Ihre PCF-Implementierung mit der eingebauten Hardware-PCF zu kombinieren (unter Verwendung von OpenGL sampler2DShadow). Dies würde weniger Schleifeniterationen von Ihrer Seite und billigere PCF zur Folge haben.
  • Kantenblockaden können mit gedrehten Poisson-Scheiben gegen Rauschen ausgetauscht werden. Abtastwerte, die zum Abtasten von der Schattenkarte verwendet werden, werden bei jeder Iteration der PCF-Schleife nach dem Zufallsprinzip gedreht.

Sie können auch die Kantenglättungstechniken erforschen wie:

Die PCF-Basistechnik leidet unter Schattenakne, die durch Anwenden eines Versatzes im Schattentest behoben werden kann. Die Berechnung der Größe dieses Offsets ist ebenfalls ein Bereich von Forschungsgebiet .

Andere erweiterte Shadow-Map-Methoden umfassen:

  • Exponentielle Schattenkarten und Varianz Shadow Maps - in den meisten Fällen leiden sie nicht unter Schattenakne und bieten glatte Kanten ohne Blockierung, jedoch zu Lasten einiger Situationen, in denen Licht austritt.
  • Exponential Variance Shadow Maps - die wahrscheinlich fortschrittlichste Technik der 2D-Tiefenkarten-Schattenkartierung, kombiniert die hohe Glätte von VSM und behebt Lichtlecks, was zu einer Verdoppelung der Speicherkosten führt.
  • Percentage Closer Soft Shadows - Grundlegende Technik zur Verbesserung traditioneller Schattenkarten mit unterschiedlicher Halbschattengröße.
  • Multiview Shadow Maps - mehrere Schattenkarten einer Technik, angeordnet auf Flächenlicht, um realistische weiche Schatten mit variierender Halbschattengröße zu berechnen,
  • Deep Shadow Maps - zur Verbesserung der volumetrischen Streuung mit Schatten,
  • Ray Traced Shadows in Echtzeit - wahrscheinlich die Zukunft.

Du hast mit PCF nicht versagt, es sieht so aus :)

Ich wünschte, es gäbe eine Möglichkeit, die Gaußsche Unschärfe auf die Schattenkarte im Kameraansichtsbereich anzuwenden, aber sie funktioniert nicht wie erwartet.

narthex
quelle
Ein Teil dieses Kommentars ist, dass Sie sich für Ihre Antwort bedanken. Ich dachte nur, ich würde es Sie wissen lassen, da Sie von dort keine Benachrichtigung erhalten.
Trichoplax
Ja, ich habe es gesehen, aber danke.
Narthex
1

Sie haben gesagt, dass "... bilineare Filterung in der Textur ...". Anscheinend interpolieren Sie die Tiefenwerte der Schattenkarte. Die korrekte Art der Verwendung der Interpolation mit der Schattenkarte besteht darin, sie auf die Ergebnisse der Schattentests anzuwenden (soweit ich mich erinnere, unterstützt OpenGL dies). Sie können sogar die Interpolation der Ergebnisse der Schattentests mit PCF kombinieren, um bessere Ergebnisse zu erzielen. Wie Sie vielleicht bemerkt haben, ist Aliasing eine Plage, die immer die Schattenzuordnung verfolgt :)

Obwohl ich verstehe, dass Sie nach Lösungen für das Shadow Mapping suchen (auch weil es recht einfach zu implementieren ist), haben Sie jemals über die Verwendung von Shadow-Volumes nachgedacht? Es ist viel komplizierter zu implementieren, leidet aber überhaupt nicht unter Aliasing, und ich denke, es würde gut zu Ihren Zwecken passen.

Christian Pagot
quelle
Vielen Dank für die Antworten! Um die gewünschten Ergebnisse zu erzielen, ist es möglicherweise angebracht, auf Schattenvolumes zu wechseln. Die Codeflow-Verknüpfung unter "Interpolation" ist sehr nützlich - danke!
Daniel M Gessel