Lightmap Aliasing

Shawn Hargreaves hat ja in den letzten Wochen und Monaten einiges über Aliasing geschrieben. Dies war sehr interessant, aber meiner Meinung nach auch recht trocken und theoretisch. Leider lesen sich solche Artikel dann auch etwas schwerer und wirken verstaubt.

Trotzdem sind diese Artikel sehr hilfreich gewesen, bekommt man doch einiges an Basiswissen vermittelt, das man nur im richtigen Moment anwenden muss, um ein konkretes Problem lösen zu können. Und genau dies konnte ich eben machen. Im XNA.mag Forum habe ich in den letzten Tagen viel über Lightmaps und einen Prototypen geschrieben und sehr interessante Diskussionen führen können. Dort habe ich auch einiges an Fortschritt dokumentieren können in Sachen DualTextureEffekt, Lightmaps und die Zusammenarbeit von Blender und XNA. Darüber werde ich auch noch das ein oder andere Tutorial schreiben, aber das erst zu einem späteren Zeitpunkt.

In diesem Artikel möchte ich ein Problem beschreiben, das während dieser Arbeiten aufgetaucht ist und das ich mit dem Wissen aus Shawn Hargreaves Blog beheben möchte. Ich hoffe, daß dieses konkrete Beispiel für einige hilfreich sein kann.

Fangen wir mit einem Screenshot aus meinem Prototypen an. Zur Information: Es handelt sich dabei um eine einfache Szene, die mit dem Dual-Texture-Effekt gerendert wird. Es sind keinerlei Lichter vorhanden, die gesamte Beleuchtung wird per Lightmaps im zweiten Texture-Slot des Effekts realisiert. Dazu werden die beiden Texturen einfach übereinander gelegt und vom Effekt auf eine bestimmte Art und Weise moduliert. Der Vorteil dabei ist, daß man die Haupttextur für gute Qualität sehr detailliert machen kann und die Lightmap kann man deutlich niedriger auflösen. Dadurch entsteht ein weicher Effekt und schöne Übergänge durch die Texturfilterung und -interpolation.

Ich habe in diesem Bild zwei unterschiedliche Säulen markiert. Im rechten Bereich grün, so wie es sein soll und so wie es gut und korrekt aussieht. Schöne Kanten und schöne Farbverläufe und eine anständige Beleuchtung. Im linken Bereich habe ich ein paar Probleme rot markiert. Das ist das hässliche Aliasing und falsche Farben „bluten“ um die Kanten. Ein Klick auf das Bild führt übrigens zu einer höher aufgelösten Variante, in der man das Problem vermutlich besser erkennen kann.

Wie entsteht dieser Effekt nun, und wie konnte ich diesen korrigieren? Ganz einfach, dazu ein zweiter Screenshot, direkt aus Blender und zwar vom UV-Editor, in dem ich die Lightmap erzeugt habe.

Auch hier habe ich wieder die Gleichen Farben verwendet. Zu Erkennen ist deutlich, daß die rot markierten UV-Koordinaten „flattern“, also eine kleine Welle bilden. Die grün markierten UV-Koordinaten haben eine exakte Kante, die bis auf die Nachkommastellen genau gerade ist. Warum Blender hier manchmal die Kanten so krumm macht… Keine Ahnung, jedenfalls führte exakt dies zu Problemen.

Warum dies so ist? Das ist einfach zu erklären. Die Grafikkarte nimmt zur Interpolation einfach die umliegenden Pixel und bildet daraus einen Mittelwert. Das ist natürlich etwas vereinfacht ausgedrückt, aber beschreibt es ganz gut. Nehmen wir einfach mal an, daß neun Pixel verwendet werden. Bei einer geraden Kante passt dies auch ganz gut. Alle Pixel liegen da, wo sie sein sollten. Bei einer diagonalen Kante kann es aber passieren, daß die eckigen Pixel nicht mit der Diagonalen übereinstimmen. Daher werden teilweise falsche Pixel verwendet. Im hinteren Bereich des linken Balkens sind dies dunkle Pixel, die „um die Kante“ gehen. Im vorderen, oberen Bereich sind dies helle Pixel. Jedenfalls kommt es zu sehr unschönen Effekten.

Leider muss man die UV-Koordinaten in Blender alle per Copy&Paste korrigieren. Wer ein wenig Python kann und Lust hat, an so einem hervorragenden Open-Source-Projekt mitzuarbeiten, der könnte mal auf die Todo-Liste von Blender schauen. Dort steht in der „einfachen Kategorie“ eine Aufgabe, in der ein kleines Tool für genau diese Korrekturen erstellt werden soll. Ihr würdet damit nicht nur mir einen großen Gefallen tun 🙂

Advertisements

Veröffentlicht am 22.07.2011 in Blender, Grundlagen, Optimierung, XNA, XNA 4.0 und mit , , , , getaggt. Setze ein Lesezeichen auf den Permalink. 6 Kommentare.

  1. Toller Artikel! Ich werde da noch mal genauer recherchieren!

  2. Also wenn ich das dual-texturing richtig verstehe hast du im Prinzip eine lichttextur mit der objekttextur in xna verschmolzen und somit auch die Beleuchtung der Szene erstellt?

    Wie reguliert du die Helligkeit der Szene und die nächste frage währe, was passiert wenn du noch neue bumpmap drauflegst?

    • Das Verhalten ist relativ einfach. Wenn die Lightmap ein mittleres Grau hat (0.5f, 0.5f, 0.5f, 1.0f) dann ist das Ergebnis unverändert. Wenn die Lightmap dunkler ist, dann wird es dunkler und wenn sie heller ist, dann wird es heller. Das ist das Geheimnis dahinter.

      Wenn ich also die Helligkeit der Szene regulieren möchte, dann reguliere ich einfach die Helligkeit der Lightmap. Und eine Bump-Map kann man ja nicht so einfach „drauflegen“. Der Dual-Texture Effekt unterstützt keine Bump-Maps. Man hat also zwei Möglichkeiten:

      a) Dual-Texture-Effekt durch einen eigenen ersetzen, der Bump-Maps unterstützt. Dies ist im Grunde genommen so, wie jeder andere Bumpmap-Shader auch. Nur das halt teilweise die Lichtwerte nicht berechnet werden, sondern aus der Lightmap kommen.
      b) Multi-Pass-Rendering. Es sollte möglich sein, einen Bump-Map-Render-Pass durchzuführen (in dem nur die Bump-Map gerendert wird mit entsprechenden Lichtwerten) und diesen dann multiplikativ mit dem Dual-Texture-Ergebnis kombinieren.

      Ich werde zu diesem Thema aber definitiv noch ein Tutorial schreiben.

  3. Okay danke für die Ausführung 🙂

    Ich hatte das bisher so verstanden das ich ein 3D Modell erstelle, dieses mit Texturen, Light, Alpha, Bumpmap ausstatte, dann das X oder FBX ( ? ) format exportiere und XNA das bestenfalls anstandslos aufnimmt.

    Scheint aber doch einiges mehr an arbeit zu sein als ich gedacht habe.

    • Wenn du den passenden Shader/Effekt dafür hast, dann ist dies im Grunde genommen auch richtig. Wobei die Kombination nicht unbedingt Sinn macht 🙂

      Dies hier ist halt eine Art der Beleuchtung. Hier wird zur Kompilier- bzw. Modellierzeit bereits festgelegt, wie die Beleuchtung aussieht und diese wird vorberechnet. Später muss halt lediglich dargestellt werden.

  4. runder haarausfall

    Guter Beitrag .

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: