Applied Geometry (CAGD)

Fan Texturing

  • Type:Diplomarbeit
  • Date:2010
  • Author(s):Marius Elvert

Übersicht

Diese Arbeit beschäftigt sich mit einem neuen Verfahren zur Texturierung von 3D-Modellen. Üblicherweise werden solche Modelle in einem rechenintensiven Prozess zerlegt, parameterisiert und in den zweidimensionalen Raum gepackt, um eine angemessene Verteilung von Texturelementen (Texels) zu gewährleisten. Diese Verfahren sind zwar in der Praxis erprobt, aber in der Regel nicht vollkommen automatisiert. Ein wichtiger Aspekt der Zielsetzung war, dass sich das Verfahren auf große Landschaftsmodelle mit höherer Topologie anwenden lassen sollte, die etwa Tunnels, Bögen, Steilwände und Überhänge enthalten.

 

Terrain
Eine mit dem Fan-Texturing Verfahren texturierte Landschaftsszene.
Die Textur ist dabei mehrere hundert Megabyte groß.

 

Details

Das Verfahren verzichtet auf eine globale Parametrisierung und überdeckt stattdessen das Modell mit Teilen seiner eigenen Dreiecksfächer. Diese Teile werden jeweils affin auf die Textur abgebildet. Daher rührt auch der Name des Verfahrens: "Fan Texturing".

Es wird erklärt, wie diese Überdeckung erstellt wird und sich die zugehörigen Abbildungen zusammen mit dem Modell speichern lassen. Dabei wird die Topologie des Modells nicht verändert. Mittels Geometry-Shadern lassen sich diese Abbildungen während des Zeichenvorgangs effizient auf der Grafikkarte auswerten. Es wird dabei eine auf der ganzen Oberfläche stetige Texturfunktion definiert.

Des Weiteren unterstützt das Verfahren Virtualisierung. Das heißt, dass die Textur nie ganz im Grafikspeicher liegt, sondern nach Bedarf von der Festplatte oder einem anderem langsamen Medium nachgeladen wird. Dies ermöglicht Texturen mit Größen von mehreren hundert Megabyte, während nur wenige Megabyte auf der Grafikkarte benutzt werden. Da gängige Bildschirme immer höhere Auflösungen darstellen können, werden solche Texturen auch benötigt.

In der Vorverarbeitung wird zu jedem Dreiecksfächer in dem Originalmodell eine Teilfläche um den zentralen Stützpunkt des Fächers berechnet. Im Gegensatz zu ganzen Fächern, von denen je drei jedes Dreieck vollständig überdecken, überlappen sich diese Teilflächen gegenseitig nur in kleinen Teilen. Jeder von ihnen wird eine eigene Texturkachel zugewiesen. Jene Teilflächen werden auch als "partielle Fächer" bezeichnet. Dann wird jedem Fächer eine Projektionsrichtung zugeordnet. Der partielle Fächer wird dann orthogonal zu dieser Richtung projiziert. Die zugehörigen Unterraumkoordinaten bilden ihn in den R^2 ab. Es wird eine weitere Abbildung erzeugt, die das Bild des partiellen Fächers durch euklidische Bewegung und Skalierung in das Einheitsquadrat abbildet. Die Verkettung der beiden Abbildungen sei die normalisierte Texturierungsabbildung. Diese wird in den Stützpunkten des Modells gespeichert.



1. Ein Modell wird geladen und die Dreiecke
seinen Stützpunkten zugeordnet.

2. Zu jedem Fächer wird ein partieller
Fächerkonstruiert (hier farbig) und eine
Projektionsrichtung festgelegt.

   
3. Die Bilder der partiellen Fächer unter der
entsprechenden Projektion werden in einer
einzigen virtuellen Textur zusammengepackt.
 4. Das Modell kann nun texturiert werden.

Zur Laufzeit werden die den partiellen Fächern zugeordneten Texturkacheln nach Bedarf von der Festplatte geladen. Dabei werden je nach Verfügbarkeit Varianten der Texturkachel in niedrigeren Auflösungen verwendet. Dies geschieht analog zum bekannten Mipmapping-Verfahren. Die geladenen Texturkacheln werden gemeinsam in einer Atlastextur gehalten. Das Nachladen der Kacheln geschieht hierbei asynchron: Ist eine Kachel nicht in der gewünschten Detailstufe vorhanden, wird sie im Hintergrund geladen und zwischenzeitlich durch eine Kachel in niedrigerer Auflösung ersetzt.

   
 Das rechte Bild zeigt den Zustand der Atlastextur bei der Darstellung der linken Szene.

Im Vertex-Shader wird die einem Stützpunkt und damit einem partiellen Fächer zugeordnete normalisierte Texturierungsabbildung mit einer Abbildung von den Kacheln in die Atlastextur verknüpft. Für jedes Dreieck werden im Geometry-Shader diese Abbildungen von den Stützpunkten eingesammelt und geordnet an den Fragment-Shader weitergegeben. Zusätzlich werden baryzentrische Koordinaten generiert und übergeben. Im Fragment-Shader wird aus den baryzentrischen Koordinaten berechnet, in welchem partiellen Fächer sich das Fragment befindet. Die entsprechende Abbildung wird ausgewertet und ein Farbwert ermittelt. Liegt das Fragment in einem Bereich, in dem sich mehrere partielle Fächer überschneiden, wird zwischen den verschiedenen Farbwerten interpoliert, um eine stetige Texturfunktion zu erhalten.

Ein wichtiger Aspekt des Verfahrens ist die Unterstützung von hardwareimplementierter Texturdekompression. Erst der Einsatz von Texturkompression macht das Nachladen von Texturkacheln zur Laufzeit praktikabel, da ohne sie die Datenmengen zu groß wären. Allerdings bringt die Benutzung dieser verlustbehafteten Kompressionsverfahren einige Schwierigkeiten mit sich, die es bei dem Entwurf des Verfahrens zu beachten galt. Farben von benachbarten Kacheln können sich unter Umständen beeinflussen (sogenanntes "color bleeding"), was zu vermeiden ist. Das Problem wird durch geschicktes Packen der Kacheln gelöst.
Ähnliche Probleme ergeben sich bei Verwendung des bilinearen Interpolationsfilters der Grafik-Hardware. Auch dieser ist nicht auf Kachelung ausgerichtet und kann deshalb ungewollt Farbwerte von benachbarten Kacheln auslesen. Das Problem lässt sich beheben, indem man den Zugriff im Fragment-Shader auf jeweils eine einzelne Kachel pro partiellem Fächer beschränkt.

Um die praktische Anwendbarkeit des Verfahrens zu beweisen, wurde es als Teil dieser Arbeit implementiert. Das Programm wurde in C++ mit OpenGL unter Microsoft Windows erstellt. Zusätzlich zu der Basisfunktionalität bietet es die Möglichkeit, direkt auf der Oberfläche des Modells in die Textur zu malen. Schwerpunkte sind die Implementierung der Dateioperationen und die Verwendung von Pufferobjekten in OpenGL. Die Dateioperationen wurden mit der Windows-spezifischen "I/O Completion Port API" umgesetzt. Durch diese Schnittstelle ist es möglich, die vom Betriebssystem durchgeführte Pufferung und Zusammenführung von Dateizugriffen zu unterbinden. Dies führt zu besseren Latenzzeiten für die Zugriffe. Pufferobjekte bieten eine Möglichkeit, den Datenfluss zwischen dem Hauptprozessor und der Grafikkarte zu kontrollieren. Texturkacheln werden direkt in Pufferobjekte geladen, um sie dann in der Atlastextur einzubinden. Ausserdem werden das Modell und die normalisierte Texturierungsabbildung in Pufferobjekten gelagert.

Ergebnisse

Das Fan-Texturing-Verfahren ermöglicht Bildwiederholraten von mehreren hundert Bildern in der Sekunde, selbst bei großen Modellen. Im Gegensatz zu anderen Verfahren, die durch Kachelung eine globale Parameterisierung umgehen, wie zum Beispiel TileTrees, kommt unser Verfahren ohne zusätzliche Datenstruktur zur Positionierung der Kacheln aus. Die Integration mit einem Virtualisierungssystem ergibt eine Lösung zur Texturierung "aus einem Guss". Dadurch, dass die Virtualisierung auf Stützpunkt-Ebene aufgelöst werden kann, ergeben sich vielfältigere Möglichkeiten, um den Bedarf an Texturkacheln zu ermitteln. Die Vorverarbeitung ist schnell, und das Verfahren lässt sich deshalb gut auf prozedural generierte Modelle oder in Modellierungssoftware anwenden. Im Gegensatz zu etablierten Parametrisierungs-Verfahren ermöglicht das Verfahren eine auf der ganzen Oberfläche stetige Texturfunktion zu definieren, die eine "nahtlose" Texturierung erlaubt, auch bei Modellen mit höherem topologischen Geschlecht.