Ambient Occlusion einrichten

Aus LOTUS Wiki DE
Wechseln zu: Navigation, Suche

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.

Ü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:

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. Außerdem ist sie für Meshs mit großflächigen Polygonen ungeeignet - und nicht zuletzt ist es nicht möglich, hier Schatten einzu"backen", die durch die künstliche Beleuchtung entstehen.

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.

Abgesehen vom Vorgenannten erlaubt nur die Textur-AO, dass der grüne Kanal der Textur für Schatten des Kunstlichtes genutzt wird.

Durchführung

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.

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.

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.

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.

Kunstlicht (-Schatten)

Die AO-Texturen sorgen grundsätzlich dafür, dass das indirekte Licht in dunklen Ecken usw. entsprechend abgeschwächt wird. Beim direkten Sonnenlicht wird über die dynamischen Schatten dafür gesorgt, dass es nur an die richtigen Stellen gelangt. Was dagegen bisher offen bleibt, ist die Frage, wo die künstlichen Lichtquellen im Innenraum hinreichen. Im Normalfall, wenn es sich um schwarz/weiße AO-Texturen handelt, wird hier diese angewendet.

Genau genommen ist das aber nicht ganz korrekt, weil ja durchaus die explizite Anordnung der Lichtquelle(n) im Innenraum bestimmte Bereiche gezielt beleuchtet oder eben nicht.

Wer hier präzisere Lichteffekte wünscht, der kann – sofern er bereits eine normale AO-Textur verwendet – deren grünen Kanal hierfür nutzen. Denn genau genommen verwendet die "normale" AO-Berechnung stets nur den roten Kanal.

In der Praxis sieht das dann so aus:

In Blender werden entsprechende Lichtquellen platziert So, wie auch die AO-Textur in Blender erzeugt werden kann, ist es vergleichbar möglich, eine Schatten-Textur auf Basis der platzierten Lichtquellen generieren zu lassen. Diese lässt man auf eine separate Textur backen, die dieselbe Größe wie die AO-Textur haben muss. Es liegen einem nun zwei Graustufen-Texturen vor. Beide werden nacheinander wie folgt bearbeitet: Die AO-Textur wird "rot eingefärbt", d.h. der blaue und der grüne Kanal werden komplett geschwärzt oder wahlweise werden die Tonkurven von grün und blau komplett nach unten gezogen. Dasselbe wird mit der Schatten-Textur gemacht, allerdings wird diese "grün eingefärbt" (roten und blauen Kanal reduzieren/schwärzen). Die Schatten-Textur wird nun über die AO-Textur gelegt und mit dieser "additiv" vereinigt. Das Resultat ist eine Bitmap, die "so ziemlich gelb" ist; zur Erläuterung: Bereiche, die schwarz oder gelb sind, sind in beiden Originaltexturen schwarz oder weiß und somit abgeschattet/beleuchtet, rote Bereiche degegen sind jene, wo zwar das ambiente Licht hinreicht, die Innenbeleuchtung jedoch nicht - bei grünen Bereichen ist es genau andersherum. Die Konfiguration dieser "Hybrid-Textur" erfolgt so, als wäre es eine völlig normale AO-Textur.