# Umgebungsverdeckung

Umgebungsverdeckung (englisch Ambient Occlusion, AO) ist eine Shading-Methode, die in der 3D-Computergrafik verwendet wird, um mit relativ kurzer Renderzeit eine realistische Verschattung von Szenen zu erreichen. Das Ergebnis ist zwar nicht physikalisch korrekt, reicht jedoch in seinem Realismus oft aus, um auf rechenintensive globale Beleuchtung verzichten zu können.
Umgebungsverdeckung wird zusätzlich zum herkömmlichen Shading mit Phong Shading oder ähnlichen Algorithmen berechnet. Das Ergebnis der AO-Berechnung wird als Graustufenbild einfach mit dem herkömmlichen Renderergebnis multipliziert. Dies kann direkt beim Rendern oder auch erst in der Nachbearbeitung erfolgen. Ein Bild, das mittels Umgebungsverdeckung berechnet wurde, ähnelt der Beleuchtungssituation eines bewölkten Tages – äußerst diffuse Schattierungen sind das Hauptmerkmal.
Umgebungsverdeckung wird von den meisten Render-Engines in Form eines Shaders oder als globaler Effekt unterstützt.

## Funktionsweise

Umgebungsverdeckung basiert auf der Beobachtung, dass in Ritzen und Ecken normalerweise eine geringere Beleuchtungsstärke vorherrscht, was hauptsächlich auf die zahlreichen, diffusen Reflexionen, die an diesen Engstellen auftreten, zurückzuführen ist. Die physikalisch exakte Berechnung dieser Lichtverhältnisse ist extrem zeitaufwändig, weshalb die Technik der Umgebungsverdeckung hier ansetzt.
Das Verfahren simuliert eine Einheitskugel aus Licht, die bestimmte oder alle Objekte einer 3D-Szene beleuchtet. Ankommendes Licht kann also nur mittels Selbstverdeckung durch diese Geometrie blockiert oder prozentual abgeschwächt werden. Dabei werden zwei Parameter pro Messpunkt errechnet: der prozentuale Grad der Verdeckung und der Bent Normal („gebeugte Senkrechte“), der in die Richtung der prozentual niedrigsten Verdeckung zeigt. Der Bent Normal kann später für erweiterte Beleuchtungssimulationen genutzt werden, z. B. im Lichttransfer über Irradiance Environment Maps.

## Berechnung der Parameter

Die zur Errechnung der beiden oben genannten Parameter nötige Vorgehensweise lässt sich in zwei prinzipielle Klassen unterteilen: Die Inside-Out Verfahren stellen den klassischen Ansatz zur Berechnung dar. Hierbei werden vom Messpunkt aus Strahlen über dessen Hemisphäre $\Omega$ verschickt und auf Kollision mit dem Objekt selbst geprüft. Stößt der Strahl in Richtung $\omega$ mit einem Teil der Geometrie zusammen, so kann kein Licht aus dieser Richtung am Punkt ankommen. Das Gegenteil ist der Fall, sollte der Strahl seinen Weg ungehindert fortsetzen können. Stellt man dieses Verhältnis durch eine Visibility-Funktion $V$ dar, die im Fall einer Verdeckung den Wert 0, ansonsten 1 annimmt, so errechnet sich der Grad der Verdeckung durch die Integration der Visibility-Funktion über der Hemisphäre $\Omega$ des Punkt $\mathbf {x}$ mit Normalenvektor $\mathbf {n}$ durch
$A(\mathbf {x} ,\mathbf {n} )={\frac {1}{\pi }}\int _{\omega \in \Omega }V(\mathbf {x} ,\omega )\left|\omega \cdot \mathbf {n} \right|d\omega$
Diese Funktion lässt sich durch Monte-Carlo-Integration einfach über einen Raytracer implementieren. Mittelt man alle Strahlen, die nicht von Geometrie verdeckt wurden, erhält man gleichzeitig den Bent-Normal. Es sei darauf hingewiesen, dass der Bent-Normal nicht zwangsweise korrekt ist: Spezielle Situationen können dazu führen, dass die Verdeckung eines Punkts den durchlässigen Teil der Hemisphäre zweiteilt. In diesem Fall gibt es keine eindeutige Richtung der niedrigsten Verdeckung.
Die zweite Klasse zur Ermittlung der Umgebungsverdeckungsparameter bilden die Outside-In-Verfahren. Hierbei wird das Objekt von außen betrachtet. Es wird der Punkt $\mathbf {x}$ zentriert und das Objekt um zufällige Raumwinkel $\alpha$ und $\beta$ gedreht. Über die OpenGL-Erweiterung ARB_Occlusion_Query, welche die Anzahl von Fragmenten im fertigen Bild eines Objekts zählt, kann die Sichtbarkeit des Punkts ermittelt werden. Gehört der zufällig gewählte Raumwinkel zur Hemisphäre $\Omega$ des Punkts, so kann die Sichtbarkeitsfunktion über die Erweiterung implementiert und genutzt werden. Auch hier lässt sich durch Monte-Carlo-Integration über genügend viele Samples eine gute Annäherung errechnen.

## Statische und dynamische Umgebungsverdeckung

Da das Ergebnis des Umgebungsverdeckungsverfahrens unabhängig von der Position der Lichtquellen ist, kann es für statische Geometrie sowohl in gerenderten Bildern als auch in Echtzeitanwendungen wie z. B. Computerspielen verwendet werden.
Sollte es sich allerdings um dynamische Geometrie handeln, die zur Laufzeit unvorhersehbare Positionen und Formen annehmen kann (im Gegensatz zu Schlüsselbildanimationen), so muss die Berechnung erheblich beschleunigt werden, um Echtzeitanforderungen einer Anwendung gerecht zu werden. Diverse Ausarbeitungen zu diesem Thema existieren für die AO-Simulation einzelner Objekte. Sollen sich allerdings mehrere Objekte auch untereinander schattieren können, so müssen bei der Berechnung alle Objekte gleichzeitig in Betracht gezogen werden. Da dieser Aufwand für aktuelle Grafikbeschleuniger zu hoch ist, wird eine Approximation vorgeschlagen, die AO-Parameter für die Umgebung eines Objekts vorberechnet, und in Cubemaps speichert. Diese werden zur Laufzeit bei einer Kollision zwischen Objekten ausgelesen und auf die AO-Parameter der kollidierenden Objekte übertragen.