Im Fokus

Mesostrukturen und die Texturen der Zukunft

Eine der besonderen Herausforderungen bei der Modellierung von 3D Objekte für ein Computerspiel ist es, die Modelle möglichst detailreich aussehen zu lassen, ohne dabei allzu viele Speicherplatz zu benötigen. Mesostrukturen sind feine, geometrische Details, die im Digital Sculpturing Prozess entstehen, deren Realisierung in der Game-Engine durch Normal Mapping jedoch oft zu visuellen Problemen, z.B. beim Schattenwurf führt. Polynomial Texture Maps erlauben es, Beleuchtung und Schattenwurf direkt in Texturen zu integrieren.

In diesem Artikel beschreibt Prof. Christof Rezk-Salama diese mögliche Entwicklungsrichtung im Bereich 3D Grafik.

Betrachtet man die Entwicklung der 3D Grafik in Computerspielen der letzten Jahre, so entgeht einem sicherlich kaum der enorme Aufwand, der von Künstlern und Programmierern gleichermaßen betrieben wird, um virtuelle Welten und deren Bewohner zum Leben zu erwecken. Sowohl auf technischer als auch auf künstlerischer Seite steigen die Anforderungen sehr rapide. Kontinuierlich werden neue Techniken entwickelt, die die enorme Komplexität dieser virtuellen Welten handhabbar machen sollen.

Lässt man der Leidenschaft des kreativen Prozesses eines 3D Künstlers freien Lauf, so entstehen 3D Modelle mit sehr viel Liebe zum Detail und immer filigraneren, geometrischen Strukturen. Genau dieser Detailreichtum, den der Künstler so liebt, wird jedoch oft zum Problem, wenn eine große Anzahl derartiger 3D Modelle in einem Computerspiel in Echtzeit dargestellt werden muss. Schnell wird klar, dass Kompromisse gefunden werden müssen, beispielsweise was die Anzahl der Polygone oder die Auflösung der Texturen betrifft.

Shape and Appearance

In dem Bestreben diesen Kompromiss so gering wie möglich zu halten, macht man sich bereits vor der Modellierungsphase Gedanken über die Datenkomplexität des Ergebnisses. Während wir in der realen Welt ohne Probleme vom makroskopischen in den mikroskopischen Bereich wechseln können, würde dies für eine virtuelle Welt enorme Datenmengen bedeuten, die generiert, gespeichert und dargestellt werden müssen. Möchten wir ein möglichst realistisches 3D Modell erzeugen, so unterscheiden wir daher in der Computergraphik anhand ihrer Auflösung zwischen unterschiedlichen Strukturen:

Als Makrostruktur wird alles bezeichnet, was ich mit bloßem Auge erkennen kann. Makrostrukturen werden durch die Form des Objekts, d.h. dessen Geometrie – üblicherweise ein Polygonmodell – beschrieben.

Materialeigenschaften hingegen beschreiben Mikrostrukturen. Die Geometrie von Kratzern, Rissen und Rauigkeiten können wir mit bloßem Auge nicht wahrnehmen. Jedoch sieht eine raue oder verkratzte Oberfläche durchaus anders aus als eine glatte, polierte Oberfläche, da sie einfallendes Licht unterschiedlich reflektieren.

Mikrostrukturen werden nicht durch Geometrie beschrieben, sondern durch einen Beleuchtungsalgorithmus mit entsprechenden Materialparametern. Die meisten Reflexionsmodelle unterscheiden zwischen einem diffusen Anteil, der die Rauigkeit der Oberfläche berücksichtigt (Abb.1 links) und einem spiegelnden (oder spekularen) Anteil der die Glanzlichter beschreibt (Abb.1 Mitte).

Abbildung 1: Die gleiche geometrische Form mit unterschiedlichen Materialeigenschaften: Links: Raue Oberfläche, Mitte: Spiegelnde Oberfläche, Recht: Spiegelnde Oberfläche mit Normal Map.

Abbildung 1: Die gleiche geometrische Form mit unterschiedlichen Materialeigenschaften: Links: Raue Oberfläche, Mitte: Spiegelnde Oberfläche, Recht: Spiegelnde Oberfläche mit Normal Map.

Innerhalb des 3D Workflows einer Spielentwicklung berücksichtigt man diese Unterscheidung zwischen Makro- und Mikrostrukturen durch eine Trennung der Form eines Objekts (Shape) von seinem Aussehen (Appearance). Der oben erwähnte Kompromiss liegt also darin, bei welcher Detailauflösung man diese Trennlinie zieht. Die Form eines Objekts wird durch das geometrische Modell mit einer begrenzten Anzahl Polygonen beschrieben. Das Aussehen hingegen durch Texturen und Materialeigenschaften. Eine wichtige Technik in diesem Zusammenhang ist die Verwendung einer Bump Map oder Normal Map. Dies ist eine Textur, die Orientierungen mikroskopisch kleiner Oberflächenelemente beschreibt (Abb.1 rechts). Sie hat nur Einfluss auf den Beleuchtungsalgorithmus, nicht jedoch auf die tatsächliche Geometrie und erlaubt es bildlich gesprochen ein „Relief in die Oberfläche einzustanzen“.

Normal Maps

Oberflächenstrukturen über eine Normal Map zu beschreiben ist ein Kompromiss zwischen Makro- und Mikrostrukturen. Die Normal Map ermöglicht das Vortäuschen von Detailreichtum ohne jedoch einen höheren Detailgrad bei der Geometrie zu benötigen. Das Beleuchtungsmodell in Abbildung 1, rechts, erweckt den Eindruck als enthielte die Oberfläche feine Rillen. Wenn man jedoch genau hinsieht, versagt diese Illusion an der Silhouette des Objekts: Man sieht, dass die Rillen nicht in der Silhouette enthalten sind. Solange die Rillen nicht sehr tief sein sollen, fällt dies dem Betrachter jedoch nicht weiter auf.

Ein schwieriger zu lösendes Problem, das die Illusion des hohen Detailgrades zunichtemachen kann ist der fehlende Schattenwurf . Da die feinen Rillen in Wirklichkeit nicht im geometrischen Modell enthalten sind, können sie auch keine Schatten auf die Oberfläche werfen (Self-Shadowing). Hier gilt das gleiche wie bei der Silhouette: Solange die Rillen nicht sehr tief werden, fällt dies nicht weiter auf.

Wir sehen also, dass gewisse visuelle Aspekte von Rillen, Kratzern und Oberflächenrauheit, als Reflexionseigenschaften (z.B. Glanzlichter) wahrgenommen werden, andere jedoch als Geometrie (Schatten, Silhouette). Man spricht in diesem Fall von den sogenannten Mesostrukturen. Dies sind Strukturen, die zwar nicht so mikroskopisch klein sind, dass man sie mit bloßem Auge nicht mehr erkennen könnte, jedoch wiederum zu fein sind, um sie effizient als Geometrie darzustellen.

Mesostrukturen

Im klassischen 3D Workflow trennt man das 3D Modell von seiner Textur und diese wiederum von dem Algorithmus zur Beleuchtungsberechnung. In einer aufwändigen Spielentwicklung gibt es oft sogar drei unterschiedliche Spezialisten im Team,

  • den 3D Artist, der für die geometrische Modellierung verantwortlich ist,
  • den Texture Artist ,der die unterschiedlichen Texturen gestaltet,
  • und den Shader Programmer, der aufbauend auf den Texturen das Beleuchtungsmodell und den Schattenwurf implementiert.

Diese Trennung liegt in den unterschiedlichen Fähigkeiten begründet, die der jeweilige Spezialist mitbringen muss: Der 3D Artist benötigt für seine Arbeit vor allem das räumliche Vorstellungsvermögen, während der Texture Artist das Zeichnen in 2D und die Bildbearbeitung beherrschen muss. Der Programmierer hingegen muss den Grafikprozessor sehr gut kennen um effiziente Beleuchtungsmodelle umsetzen zu können.

In den letzten Jahren ist jedoch durch die Digital-Sculpturing-Programme wie Pixologic’s ZBrush und Autodesk Mudbox der sogenannte High-Poly-Workflow sehr populär geworden. Sculpturing-Programme erlauben es, ein sehr hoch aufgelöstes 3D Modell (das „High-Poly-Model“) zu erstellen und anschließend auf flexible Weise und weitgehend automatisiert die für die Echtzeit-Darstellung notwendige Trennung zwischen Shape und Appearance durchzuführen. Das Ergebnis ist ein niedrig aufgelöstes Polygonmodell („Low-Poly-Model“) für den Import in die Game Engine und ein Satz von Materialtexturen (z.B. Decal Map, Normal Map, Light Map) für die Beleuchtung.

Was die Beschreibung der Mesostrukturen (Normal-Maps) betrifft, verwischt die Schnittstelle zwischen 3D Artist und Texture Artist daher zunehmend. Jedoch herrscht immer noch eine strikte Trennung von der Texturgenerierung und der Shader-Programmierung. Dass es durchaus sinnvoll sein kann diese Trennlinie ebenfalls zu durchbrechen, zeigen jüngste Entwicklungen aus der Graphik-Programmierung. Malzbender et al. [1] untersuchen die Idee, Beleuchtung und Schattenwurf in die Textur zu integrieren und stellen eine praktische Möglichkeit vor, Beleuchtung und Schattenwurf auch beim Fotografieren eine Textur mit aufzunehmen.

Polynomial Texture Maps

Bisherige 3D Darstellungen verwenden Texturen unter anderem für die Farbe der Oberfläche (Decal Maps) und für die Orientierung des Mikrostrukturen (Normal Maps). In dem Ansatz von Malzbender et al. speichert ein Pixel in einer Textur (kurz: Texel) allerdings nicht einfach einen RGB-Farbwert, sondern eine mathematische Funktion, mit der man den Farbwert in Abhängigkeit der aktuellen Beleuchtungsrichtung ausrechnen kann. Als mathematische Funktionen bietet sich ein Polynom an. Den Farbwert C eines Texels in Abhängigkeit der Einfallsrichtung des Lichts lu und lv können wir beispielsweise als bivariates Polynom zweiten Grades beschreiben:

Die Textur speichert bei diesem Ansatz also nicht den Farbwert C direkt, sondern die Koeffizienten a,b,c,d,e und f eines Polynoms. Mit Hilfe dieses Polynoms können wir den Farbwert der Textur im Shader zur Laufzeit ausrechnen, sobald wir die Einfallsrichtung des Lichts lu und lv kennen. Man spricht hier von einer Polynomial Texture Map. Was nun fehlt ist allerdings eine Möglichkeit die Polynomkoeffizienten für ein existierendes Material in der Praxis zu bestimmen.

Akquisition von Polynomial Texture Maps

Möchte man eine herkömmliche Farbtextur von einem realen Objekt (z.B. einem Holzboden oder einer Ziegelmauer) abfotografieren, so versucht man das Objekt möglichst gleichmäßig diffus auszuleuchten. Dies geschieht in der Regel durch Verwendung eines Diffusorblitzes oder einer Soft-Box. Man versucht dadurch, die Glanzlichter im Bild weitestgehend zu reduzieren um sie im Beleuchtungsmodell später dynamisch hinzu zu rechnen. Um eine Polynomial Texture Map aufzunehmen, versucht man hingegen möglichst viele Einzelbilder mit unterschiedlichen Lichtrichtungen aufzunehmen. Wir fotografieren eine Oberfläche mehrmals mit unterschiedlichem Einfallswinkel des Lichts (lu,lv) und erhalten einen Satz von individuellen Einzelbildern C(lu,lv) (siehe Abbildung 2).

Abbildung 2: Aufnahme von Einzelbildern mit unterschiedlichen Einfallswinkeln des Lichts.

Abbildung 2: Aufnahme von Einzelbildern mit unterschiedlichen Einfallswinkeln des Lichts.

Anschließend betrachtet man denselben Texel in den unterschiedlichen Bildern und bestimmt die Koeffizienten eines Polynoms, das die unterschiedlichen Farbwerte für einen Texel approximiert. Dies geschieht mit Standardverfahren zur Minimierung des quadratischen Fehlers (Polynom-Fitting). Die gefundenen Polynomkoeffizienten speichert man anschließend anstelle des Farbwerts in einer Textur. Der Shader-Programmierer muss nun lediglich die Koeffizienten aus der Textur auslesen, mit der aktuellen Beleuchtungsrichtung das Polynom bilden, und erhält einen beleuchteten Farbwert mit den realen Reflexionseigenschaften des aufgenommenen Materials, inklusive des Schattenwurfs der Mesostrukturen.

Anstelle eines Diffusorblitzes bzw. eine Softbox benötigt man für die Aufnahme einer Polynomial Texture Map ein Gerät mit dem man die Einfallsrichtung des Lichtes kontrollieren kann. Ein derartiges Gerät kann man mit etwas Aufwand selbst bauen. Es besteht aus einer kuppelförmigen Anordnung von Leuchtdioden (LEDs) mit hoher Leuchtkraft und möglichst breitem Streuwinkel. Abbildung 3 zeigt den Aufbau einer mit LEDs bestückten Konstruktion aus Aluminiumröhren, die im Rahmen eines Studentenprojektes des Abschlußjahrgangs im Gamedesign an der MD.H Düsseldorf entstanden ist. Die Fotokamera wird an einer Öffnung am Zenit der Kuppel befestigt (Abbildung 4). Für jede Leuchtdiode bestimmt man anschließend die Einfallsrichtung des Lichts lu und lv .

Abbildung 3: Links: Gerät zur Aufnahme von Polynomial Texture Maps. Rechts: Studenten des Abschlussjahrgangs beim

Abbildung 3: Links: Gerät zur Aufnahme von Polynomial Texture Maps. Rechts: Studenten des Abschlussjahrgangs beim

Abbildung 4: Das Aufnahmegerät mit Kamera in Aktion.

Abbildung 4: Das Aufnahmegerät mit Kamera in Aktion.

Bau des Gerätes

Prinzipiell kann man die einzelnen LEDs von Hand ein und ausschalten, Komfortabler wird es, wenn man die LEDs über eine handlesübliche USB-Relais-Karte an einen PC anschließt, der parallel dazu die Aufnahmen der Kamera steuert. Auf diese Weise kann man den gesamten Akquisitionsprozess vollständig automatisieren.

Abbildung 5 zeigt das Ergebnis einer kleinen Test-Szene die im Rahmen des Studentenprojekts aufgenommen wurde. Obwohl es sich hier um eine flache Textur handelt, zeigt das Bild realistische Beleuchtungseffekte und Schattenwurf der darin enthaltenen Mesostrukturen. Ein nächster Schritt wird sein, diese Technik in den 3D Workflow aktueller Game-Engines zu integrieren.

Polynomial Texture Maps haben im Bereich der Produktvisualisierung z.B. im Automotive Bereich bereits Einzug in die Computergraphik erhalten. Sie eignen sich hervorragend für die Integration in aktuelle Game-Engines. Es ist daher sehr wahrscheinlich, dass viele Studios ihren Workflow an diese neue Technologie anpassen und Polynomial Textures bald ihren Weg in den Computerspielbereich finden werden. Die Vorteile sind ein erhöhter Grad an visuellem Realismus, da Oberflächenreflexionen realitätsnah umgesetzt werden können und die Mesostrukturen realistisch Schatten werfen.

Abbildung 5: Ergebnis einer aufgenommenen Test-Szene als Polynomial Texture Map.

Abbildung 5: Ergebnis einer aufgenommenen Test-Szene als Polynomial Texture Map.

Referenzen:

[1] Tom Malzbender, Dan Gelb und Hans Wolters: Polynomial Texture Maps. In Proceedings of ACM SIGGRAPH 2001

[2] Hewlett Packard Research: Polynomial Texture Maps, http://www.hpl.hp.com/research/ptm/