Ambient Occlusion einrichten

  • Ambient Occlusion (AO) ist eine Technik, bei der die weichen Schatten, die sich infolge der indirekten Umgebundsbeleuchtung ergeben, vorberechnet und in eine separate Textur oder in die Mesh-Daten gespeichert werden. Vorberechnet werden die Werte wegen des sehr hohe Rechenaufwands, der heutzutage eine (präzise) Echtzeitberechnung nicht erlaubt. Da von einer näherungsweise konstanten Umgebungsbeleuchtung ausgegangen werden kann, ist dies aber auch kein Problem.

    1 Überblick

    Es ist zunächst zwischen zwei grundsätzlich verschiedenen Techniken zu unterscheiden:

    • Per-Vertex-AO: Für jeden Eckpunkt des Meshs wird im ContentTool ermittelt, wie stark er vom Umgebungslicht (ambientem Licht) beleuchtet wird.
    • Textur-AO: Die Helligkeitswerte werden entweder händisch oder in einem entsprechend ausgestattetem Grafikprogramm in eine Textur als Graustufen "gemalt", die anschließend herkömmlich im ContentTool ausgewählt wird.

    Beide Methoden haben ihre Vor- und Nachteile und gewisse Eigenheiten:

    1.1 Per-Vertex-AO

    Die erste Methode ist besonders gut geeignet für filigrane oder kleine Objekte mit ausgeprägten Formen, z.B. Schalter, Knöpfe, Griffe usw. und/oder in sich geschlossenen Flächen, wie z.B. Zylinder und Kugeln, bspw. Haltestangen. Solche verfügen in der Regel über eine hohe Vertex-Dichte, wohingegen ein sauberes Mapping einer Textur schwierig oder unmöglich ist. Die entsprechend hohen Textur-Auflösungen, die nötig wären, um die AO präzise genug abzubilden, würden außerdem zu großem Speicherbedarf führen. Allerdings nutzt die Per-Vertex-AO die sekundären Texturkoordinaten als Speicherplatz für die Helligkeitsinformationen. Es ist also nicht möglich, einem Mesh eine Meshanimation und gleichzeitig Per-Vertex-AO zuzuweisen.

    1.2 Textur-AO

    Die zweite Methode ist optimal geeignet für eher flächige und grobe oder eckige Objekte, die überwiegend aus relativ ebenen und zueinander eckigen Flächen bestehen – beispielsweise Innen- und Zwischenwände, Böden, Bodenpodeste und Decken. Hier ist das Mapping mit einer Textur unproblematisch. Dafür ist aber die Vertex-Dichte so gering, dass die Übergänge zwischen den Vertices den Eindruck stark verfälschen und ggf. Details völlig unberücksichtigt bleiben. Derlei auszugleichen funktioniert nur mit einer Textur, die die nötige Auflösung hat.


    Bei Textur-AO gibt es wiederum zwei verschiedene Ansätze:

    • Verwendung der "normalen" Texturkoordinaten
    • Verwendung alternativer Texturkoordinaten

    Auch hier hängt die Wahl natürlich von der Situation ab:


    Wenn die verschiedenen Bereiche auf der Textur entweder nur einmal im Mesh verwendet werden (z.B. bei umfangreichen und individuellen Fototexturen wie bei einem Altbau oder dem Instrumententräger) oder deren Bereiche immer (ungefähr) gleich beleuchtet werden (immer gleiche Tragwerke oder Seitenwände einer Wagenhalle), dann eignet sich die Verwendung der "normalen" Texturkoordinaten. Diese sind wesentlich einfacher zu handhaben: Die AO-Textur ist dann eine Graustufen-Textur (vom Format her trotzdem 24 bit!), die an den jeweiligen Bereichen der normalen Textur deren Umgebungs-Helligkeit vorgibt. Es ist zudem die einzige Möglichkeit, einem Objekt mit Meshanimation AO-Informationen zuzuweisen!


    Wird die Textur dagegen häufig wiederholend oder an vielen unterschiedlichen Bereichen eingesetzt, die zudem auch sehr unterschiedlich beleuchtet werden (z.B. falls der Boden im Fahrzeug nicht komplett in einem Stück gemappt wird, sondern auflösungsbedingt mit sich wiederholenden Texturen), dann kommt die zweite Variante zum Einsatz: Es werden dann sekundäre Texturkoordinaten angelegt (s.u.). Es kann dann eine völlig andere Texturaufteilung gewählt werden, bei der jeder Texturbereich nur einmalig verwendet wird – insbesondere kann der beispielhafte Fahrzeugboden hier dann in einem Stück mit geringerer Auflösung gemappt werden. Eine automatisierte und für eine AO optimierte Texturauflösung ist bspw. in Blender möglich. Da – wie auch bei Per-Vertex-AO – hier die sekundären Texturkoordinaten genutzt werden, kann auch dieses Verfahren nicht zusammen mit Meshanimationen angewendet werden.


    In beiden Fällen kann die AO-Textur wahlweise manuell angelegt werden oder – falls geeignet, z.B. Blender – vom 3D-Programm generiert werden. Anschließend wird sie, wie jede andere Textur auch, in das Arbeitsverzeichnis kopiert und kann in den Materialeigenschaften ausgewählt werden.

    2 Durchführung

    2.1 Per-Vertex-AO

    Hierzu muss im ContentTool lediglich das gewünschte Mesh ausgewählt werden und im Abschnitt "Ausgewähltes Mesh" auf "Generiere Per-Vertex-AO" geklickt werden. Abgebrochen werden kann der Vorgang mit der darunterliegenden Schaltfläche "X".


    Die Berechnung der AO mit hoher Qualität ist vergleichsweise zeitaufwändig, weshalb man die Qualität einstellen kann. Eine geringe Qualität sorgt für ein unrealistisches "Rauschen" und ist eher für Tests geeignet. Vor der Auslieferung nimmt man sich dann die Zeit, bei der Berechnung mit hoher Qualität den PC sich selbst zu überlassen.


    Sofern das zugewiesene Material vom Typ "Standard" ist, wird der Materialtyp auf "Complex" gewechselt. Wichtig: Sobald die Materialeigenschaften vom ContentTool (automatisch) entsprechend für die Per-Vertex-AO eingestellt wurden, kommt es bei den restlichen Meshs, denen dieses Material zugewiesen ist, zu erheblichen Darstellungsfehlern. Es können immer nur alle oder kein Mesh eines Materials über Per-Vertex-AO verfügen.

    2.2 Textur-AO mit normalem Mapping

    Das Einrichten eines Materials mit einer AO-Textur mit normalem Mapping ist sehr simpel: Nachdem die Textur erstellt oder generiert wurde, wird sie im Arbeitsverzeichnis gespeichert. Der Materialtyp muss dann auf mindestens "Complex" eingestellt werden. Im Abschnitt "Zahlenwerte" wird der Wert für "Intensität der AO-Textur" zunächst auf 1 gestellt, in den "Optionen und ganzzahligen Werten" muss "AO-Textur aktivieren" sowie "AO nutzt Originalmapping" angehakt werden und unten muss die Textur bei "Ambient Occlusion (AO) Textur" ausgewählt werden.

    2.3 Textur-AO mit sekundären Texturkoordinaten

    Für das Einrichten der sekundären Texturkoordinaten wird im 3D-Programm zunächst eine Kopie des betroffenen 3D-Objektes angelegt. Dieses erhält den Namen des Originalobjektes und zusätzlich den Präfix "@2m_". Heißt das Originalobjekt also "Boden", dann heißt die Kopie "@2m_Boden".


    Diese Kopie muss künftig bei JEDEM Export des Originalobjektes mit exportiert werden und muss – nach Änderungen am Originalobjektes – diesem von der Form her wieder genau angeglichen werden, idealerweise muss eine neue Kopie angelegt werden. Kleinste Abweichungen der Vertex-Daten (Position, Normale usw.) sind ok, mehr wird aber nicht toleriert.


    Die Technik ist nun die Folgende: Beim Import von Original-Objekt und @2m_-Kopie in das ContentTool werden nun die Texturkoordinaten der Kopie in das Originalobjekt übernommen und als zweiten Satz Texturkoordinaten gespeichert. Nach dem Import dieses Objekt-Paares sollte dennoch nur ein neues Objekt erscheinen; das @2m_-Objekt darf in der Liste rechts nicht auftauchen!


    Das Einbinden erfolgt dann wie bei der Textur-AO mit normalem Mapping, mit dem Unterschied, dass in den Materialeigenschaften der Haken "AO nutzt Originalmapping" nicht gesetzt wird.

    2.4 Intensität

    Der Zahlenwert "Intensität der AO-Textur" kann bei allen drei Verfahren genutzt werden, den AO-Effekt abzuschwächen. "Abschwächen" heißt in diesem Fall, dass der Gesamteindruck heller wird.