Arbeitsumgebung

Alle interaktiven Echtzeit-Rendering-Projekte entstehen in einem ähnlichen Workflow. Die 3D-Engine unserer Wahl ist Unity 3D. Der ausschlaggebende Grund für die Auswahl der Engine: Sie unterstützt viele Plattformen. Damit kann eine Anwendung mit einer Code-Basis sowohl für Android- als auch iOS-Geräte exportiert werden – wenngleich manchmal einige plattformbedingte Anpassungen notwendig sind.

Zusätzlich zur Multi-Plattform-Unterstützung spielt der Unity-Support durch die Hersteller neuartiger Hardware-Geräte und Software-Produkte eine große Rolle. Das heißt: Fast jeder Hersteller eines neuen Produkts wie z. B. Microsoft HoloLens oder Oculus Go stellt SDKs und Entwickler-Werkzeuge für Unity bereit. Das liegt sicherlich auch an der Beliebtheit der Engine. Denn „mit Unity werden weltweit die Hälfte aller Spiele erstellt“.

Der positive Nebeneffekt ist die riesige Community, die mit Rat und Tat zur Seite steht. Und der wirklich hervorragend gefüllte Asset Store, mit dem man sehr viel Zeit in der Produktion spart.

Moderne 3D-Engines stellen keine besonderen Anforderungen an die Daten, mit denen sie arbeiten können. Audio-Dateien, Grafiken und 3D-Modelle können in vielen unterschiedlichen Formaten angeliefert und verarbeitet werden. Vor allem bei der Erstellung der 3D-Daten müssen allerdings einige Best Practices berücksichtigt werden. Dazu aber später mehr. Grundsätzlich sollten 3D-Modelle für Echtzeitgrafik eine saubere Topologie haben und möglichst wenige einzelne Elemente sowie ein gutes UV-Mapping aufweisen.

Der Echtzeit-Grafik-Workflow besteht aus einer geringen Anzahl an Software-Produkten für eine unkomplizierte Produktion

3D-Modeling

Zur Erstellung der 3D-Modelle setzen wir unterschiedliche Software-Produkte ein. Eigentlich können die Low-Poly-Modelle reibungslos mit einer Vielzahl unterschiedlicher Programme erzeugt werden. Die grundlegenden Modeling-Tools zur Mesh-Produktion unterscheiden sich nicht signifikant.

Größere Unterschiede gibt es bei speziellen Effekten wie z. B. Partikel-Systemen, Deformations-Werkzeugen und Klonern oder Animationen und deren Export. 3DS Max und Maya bieten sehr gute Werkzeuge zur Charakter- und Hard-Surface-Animation. Man kann reibungslos Deformer- und Skin-Animationen in die *.fbx Dateien schreiben. Das erleichtert den Import in die 3D-Engines.

Cinema 4D ist effektiver in prozeduralen Animationen und der Arbeit mit Klonen. Wenn es um den Export komplexer Animationen (z. B. Morph oder Displacement) aus Cinema 4D geht, wird die Situation ziemlich kompliziert. Vor allem, wenn diese in einer Game Engine verwendet werden sollen. Vieles ist nur über komplexe Umwege möglich.

Einen besonderen Platz in der Produktions-Pipeline nimmt zBrush ein. Und das, obwohl gängige 3D-Modellierungs-Programme auch Sculpting-Kapazitäten haben. Ungeschlagen sind die Werkzeug-Palette von zBrush, der Umgang mit großen Polygon-Mengen und deren dynamische Unterteilung. Die Integration in den Workflow gestaltet sich sehr einfach.

zBrush wird vor allem dann eingesetzt, wenn Modelle mit einem sehr hohen Detailgrad erstellt werden sollen, ohne die Polygon-Anzahl in die Höhe zu treiben. Das High-Poly-Mesh aus zBrush wird im Texturierungs-Schritt zum Backen der Details auf das Low-Poly-Mesh verwendet. Obwohl die moderne Hardware deutlich leistungsstärker geworden ist und die Spiele / Visualisierungen sogar auf einem Smartphone schon eine umwerfende Grafik mitbringen, ist Optimierung weiterhin das A und O. Und der Wunsch, die Grenzen des technisch Machbaren auszuloten, setzt derzeit voraus, dass die Erstellung der Low- und High-Poly-Modelle weiterhin ein gängiges Mittel bleibt. Manchmal kann man sich aber mit einer guten Texturierungs-Software die Erzeugung der High-Poly-Modelle sparen.

Der Export jeglicher 3D-Daten sollte in universalen Formaten erfolgen. Für Unity ist es kein Problem, *.c4d- oder *.max-Dateien zu öffnen. Allerdings nur solange die entsprechenden Software-Pakete auf dem Rechner installiert sind. FBX und OBJ werden nativ importiert. Damit steht der Projekt-Migration auf einen anderen Arbeitsrechner oder kollaborativer Arbeit nichts im Wege.

UV-Mapping und Texturierung

UV-Mapping beschreibt einen Vorgang, bei dem die 3D-Punktkoordinaten eines Modells auf ein flaches 2D-Layout transferiert (gemapped) werden. Je sauberer es durchgeführt wird, desto besser werden die Ergebnisse im weiteren Verlauf. Das ist nur möglich, wenn die Punkte verzerrt werden. Dazu wird das Modell an gut gewählten Kanten „geschnitten“ und die Flächen werden „ausgewickelt“. Das Ziel sind möglichst wenige sichtbare Verzerrungen der Textur und Schnittkanten.

Die grünen Linien zeigen die gesetzten Schnittkanten im UV-Layout

Anschließend platziert man diese sogenannten Inseln auf dem Texturlayout. Man sollte unbedingt berücksichtigen, welche Größe die Textur haben wird (z. B. 2k 2048 x 2048 Pixel) und welche Objekte prominent in der Szene sichtbar werden und welche nicht. Den wichtigen Objekten sollte man eine größere Texturfläche zur Verfügung stellen. So bleiben möglichst viele Details im finalen Produkt sichtbar.

Jedes einzelne Element einer Szene muss auf dem UV-Layout einen eindeutigen Platz finden. Objekt-Inseln dürfen nicht übereinander liegen. Vor allem für mechanische, sogenannte Hard-Surface-Modelle ist UV-Mapping eine echte Herausforderung. Meistens ist es kein Problem, Schnittkanten zu finden, die das Erscheinungsbild nicht beeinflussen werden. Dazu müssen erfahrungsgemäß sehr viele Schnitte gesetzt werden, weil es sonst zu starken Verzerrungen kommen kann. Häufig bestehen solche Modelle auch aus einer sehr großen Menge einzelner Elemente. Da wird es schwierig, den Überblick zu behalten. Damit das nicht passiert, füge ich ein „_[mapped]“ am Ende des Objektnamens hinzu.

Aber wofür der Aufwand? Man könnte doch mit Materialien arbeiten, die auch besondere Effekte (Rauigkeit, Oberflächenstruktur, Glanz, Rost etc.)  mit einem entsprechenden Shader darstellen könnten. Ja, und das ist auch der einfachere Weg! Problematisch wird es bei Szenen für Mobilgeräte mit über 400.000 Polygonen.

Im Echtzeit-Rendering gibt es das Konzept der Draw Calls. Also der Anweisungen an die Grafikkarte, Objekte darzustellen. Für jedes Objekt und jedes Material in der Szene muss mindestens ein Draw Call getätigt werden. Um die Programm-Performance hoch zu halten, müssen die Draw Calls auf ein Minimum reduziert werden. Je weniger, desto besser.

Dafür fasst man in der 3D-Software alle Elemente zusammen, die nicht separat animiert werden und die ein Material teilen. Wenn also ein Bürostuhl aus Leder-Sitzflächen, Plastik-Armlehnen, einem Metallfuß und Plastikrädern einer anderen Farbe besteht, entstehen 4 einzelne Objekte, 4 Materialien und 4 Draw Calls. Wurde der Stuhl texturiert, können die Material-Eigenschaften auf einem Material mittels der Texturen simuliert werden. Es entsteht ein Modell, ein Material, ein Draw Call. Überträgt man diesen Workflow auf das gesamte Modell (z. B. auf das Labor von Oemeta), wird dieses von insgesamt 4 Materialien beschrieben.

Ein texturiertes Modell kann unterschiedliche Oberflächen-Eigenschaften in einem Material implementieren

UV-Mapping ist ein zeitaufwendiger Schritt in diesem Workflow, der teilweise wirklich wenig Spaß macht. An diesem kommt man aber nicht vorbei, wenn das Ziel ein detailreiches und performantes Modell für Echtzeit-Rendering ist.

Meine Software der Wahl für UV-Mapping ist 3Ds Max. Das Programm bietet nahezu alle notwendigen Tools, um die Arbeit möglichst einfach zu gestalten. Dennoch ist es für mich zum großen Teil ein manueller Vorgang. Zwar existieren einige halb- oder vollautomatische Mapping-Systeme wie z. B. Ptex. Doch diese eignen sich kaum für Echtzeit-Rendering und 3D-Engine-Features, die das Leben eines Entwicklers einfacher machen.

Nachdem das Modell sauber gemapped ist, kommt die Belohnung in Form eines mitunter langwierigen, aber kreativen Prozesses der Texturierung. Da UV-Layouts simple 2D-Bilder sind, können sie in beliebigen Bildbearbeitungs-Programmen bearbeitet werden. Ich präferiere die Software Substance Painter von Allegorithmic. Das Programm kommt mit einem leistungsstarken Mesh-Importer, Texture-Baker und unzähligen (auch selbst erstellten) Materialien daher. Damit kann man sich beim Bemalen der Modelle so richtig austoben. Tools wie Polygon Fill, Symmetrie, Stempel und unterschiedliche Pinsel lassen schnelle Textur-Erstellung in hoher Qualität zu. Smart-Materials, Partikel-Effekte und Generatoren erzeugen realistische Oberflächen-Effekte.

Mit passender Software ist die Texturierung ein kreativer Prozess

Die Arbeit mit Ebenen und Masken und die große Auswahl der Überblendungs-Methoden macht Substance Painter zum Photoshop für Texturen. Die Kreativität wird nur von der Texturgröße und Hardware eingeschränkt. Genügend Arbeitsspeicher ist definitiv von Vorteil. Die entstandenen Texturen werden von Substance Painter im passenden Format für unterschiedliche Zwecke exportiert. Voreingestellte Vorgaben für Vray, Octane, Unity und Unreal können angepasst werden, falls besondere Shader-Effekte zum Einsatz kommen werden.

Mit Substance Painter können auf einer Textur glänzende Metallteile, Raufaser-Tapeten und Fell gleichzeitig untergebracht werden. Die Oberflächen-Effekte werden als passende Maps exportiert. Für Unity besteht das Standard-Set aus einer Albedo-, Metallic- und Normal-Map. Mit Substance Painter können viele Oberflächen-Details direkt mit der Material-Manipulation erstellt werden, ohne dass es eines High-Poly-Modells bedarf.

Alternativ zur Kombination 3Ds Max und Substance Painter könnte z. B. 3D Coat verwendet werden. Die Software bietet einen ähnlichen Funktionsumfang und kann sowohl für das UV-Mapping als auch für Texturierung eingesetzt werden. Die Tool-Bandbreite von 3D-Coat ist erstaunlich groß. Für mich ist die Software jedoch zu überladen. Die Arbeitsprozesse sind „klobig“ und teilweise unnötig kompliziert. Eingeschränkt ist auch das mit Cinema 4D mitgelieferte Bodypaint nutzbar. Meiner Ansicht nach ist mit diesem Plug-in aber kein ernsthaftes UV-Mapping umfangreicher Modelle möglich.

Für die Echtzeitgrafik vorbereitete Modelle können in die 3D-Engine importiert werden

Unity 3D – wo alles zusammenkommt

Alle vorangegangenen Schritte und der betriebene Aufwand hatten eines zum Zweck – die flüssige Darstellung einer Szene auf dem Display eines Mobiltelefons oder Tablets. Eine Game Engine ist der einfachste Weg, diese Darstellung auf eine möglichst große Zahl mobiler Geräte zu bringen. Wurden die vorherigen Schritte gewissenhaft ausgeführt, zahlen sie sich jetzt aus.

3D-Modelle mit UV-Koordinaten werden als FBX-Dateien importiert. Wurden in der 3D-Software Materialien, Lichter und Kameras erzeugt, können sie mit dem in Unity integrierten Importer berücksichtigt werden. Ich verzichte jedoch grundsätzlich auf den Import der Lichter und Kameras  und nehme das Licht-Set-up direkt im Unity-Editor vor. Eingebettete Materialien können für den Editor zugänglich gemacht werden. So können sie mit Texturen, die Substance Painter erzeugt hat, belegt werden. Darüber hinaus kann man im Importer die gebackenen Animationen auf korrekte Clip-Längen zuschneiden und sinnvoll benennen. Wie Animationen in Unity manipuliert werden können, ist allerdings ein großes, spannendes und auf jeden Fall separates Thema.

Unity-Import-Einstellungen ermöglichen einfaches Implementieren der erzeugten Materialien und Texturen

Den importierten Materialien werden nun Shader zugewiesen. Unity bringt ab Werk eine Vielzahl von Shadern, die für unterschiedliche Zwecke und Einsatzgebiete optimiert sind. Der Standard-Shader ist ein guter Anfang. Dieser funktioniert auf unterschiedlicher Hardware und interpretiert gängige Maps (Albedo, Metallic, Normals und einige Special Maps). Ein mobiler Shader verzichtet auf Normals, ist aber deutlich performanter. Neuerdings wurden der Engine zusätzliche Rendering-Pipelines hinzugefügt – Lightweight und HD. Diese bringen eigens optimierte Shader-Varianten.

Shader sind leistungsstarke Mini-Programme, die das Erscheinungsbild einer Anwendung drastisch verändern können. Die Programmierung der Shader ist aber ein recht komplexes Feld. Hier schafft die großartige Unity-Community Abhilfe mit Assets wie dem Amplify Shader Editor.

Trotz sehr großer Polygonzahl des finalen Modells kann es auf einem Mobilgerät dargestellt werden

Nachdem die Import-Einstellungen feststehen und die Texturen den Materialien zugewiesen wurden, kann das Modell in der Szene richtig platziert und ausgeleuchtet werden.

Ein solch großes Modell mit der riesigen Menge an einzelnen Objekten, die alle auf das Licht reagieren sollen und Schatten werfen werden, würde nicht mit Echtzeit-Schatten funktionieren. Hinzu kommt, dass weiches Licht in Unity (Area Light) grundsätzlich nicht echtzeitfähig ist. Um eine schöne Licht-Stimmung für diese Szene zu erzeugen, kam also nur Lightmapping in Frage. Dafür muss in den Import-Einstellungen für die Modelle das Generieren der Lightmap-UVs erlaubt werden.

Für weiche Licht-Schatten-Verläufe und aus Gründen der Performance wird das Licht-Set-up gebacken

Lightmapping ist eine Ausleuchtungs-Methode, bei der Licht-, Schatten- und Reflexions-Informationen für unbewegliche und nicht animierte Szenen-Objekte auf spezielle Texturen projiziert werden. Das bedeutet, dass die Licht-Informationen nicht mehr für jedes Frame von der Grafikkarte berechnet werden müssen. Voraussetzung für ein gut funktionierendes Lightmapping ist ein sauberes UV-Layout. Warum? Weil die Licht-Informationen auf die bestehende Textur aufaddiert werden. Sie bedienen sich also derselben Koordinaten. Das trifft sowohl auf den bewährten Enlighten zu als auch den neuen Progressive-Unity-Lightmapper.

Damit schließt sich der Produktionskreis der für Echtzeit-Rendering optimierten Modelle. Auch in diesem Stadium sind noch Änderungen am Ursprungsmodell möglich. Je nach Umfang dieser Änderungen ziehen sie das erneute Durchlaufen des gesamten Workflows nach sich. Entsprechend wichtig ist es, am besten schon vor dem Beginn der Modellierung konkrete Vorstellungen vom Erscheinungsbild der Szene zu haben und diese mit dem Auftraggeber eingehend zu besprechen. Auch sollte man von Anfang an so modellieren, dass die nachfolgenden Schritte möglichst unkompliziert durchgeführt werden können. Ist ein Team an dem Projekt tätig, spielt die Kommunikation aller Abteilungen (Modellierung, Texturierung, Animation, Rendering-Engineering, Entwicklung etc.) eine enorm wichtige Rolle.

Die Augmented-Reality-Funktionalität wird mit der marktführenden Bilderkennungs-Software von Vuforia umgesetzt. Die Implementierung grundsätzlicher AR-Mechanik ist inzwischen wirklich unkompliziert gestaltet. Vuforia und Unity 3D gingen eine Kooperation ein, die die entsprechenden Bibliotheken der Engine-Installation mitliefert. Für besondere Effekte und spezifisches Verhalten wurde der Vuforia-Code leicht angepasst. Diese Modifizierungen hatten auch den sparsameren Umgang mit Hardware-Ressourcen zum Zweck.

Fazit

Moderne Hardware kann unglaublich große und detailreiche Welten eindrucksvoll darstellen. Das war vor Kurzem noch unvorstellbar. Moderne 3D-Engines geben 3D- und Texturkünstlern sowie Entwicklern Werkzeuge mit, die diese Hardware ausreizen. Der Zugang zu den Tools des gesamten Workflows gestaltet sich so einfach wie noch nie zuvor. Damit können Kreative im Alleingang oder in Teams bunte und detailreiche Umgebungen aufbauen, die zum Erkunden einladen.

Echtzeitgrafik unterscheidet sich von anderen CG-Medien insbesondere dadurch, dass der Nutzer selbst entscheidet, was er sieht. So erschaffen Entwickler und Nutzer gemeinsam eine Story – eine große Welt auf einem kleinen Bildschirm.

Artyom Tokarev

Artyom ist Art Director für AR, VR und Bewegtbild bei New Communication – und wird von allen nur Arti genannt. Der studierte Multimedia Producer hat schon so einigen Kunden mit seinen Mixed Reality Kunststücken die Köpfe verdreht. So überzeugend, dass er unserer Meinung nach eigentlich Sm-Arti heißen müsste. Oder Einzig-Arti. Kurz gesagt: Wir lieben ihn einfach, unseren Arti Director.

Heiß auf Insider-Infos?

Immer up to date: Unser Newsletter versorgt Sie einmal monatlich mit brandneuen Trends und Innovationen aus der Kommunikationswelt.

Newsletter bestellen