Ich spiele mit einfachen prozeduralen 3D-Modellen, um kleine Gebäude für den 3D-Druck zu erstellen. Ein Beispiel:
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:
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:
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:
Hier ist der Einzelfall mit deaktivierter bilinearer Filterung:
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.
quelle
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.
quelle