Freitag, 30. November 2007

Ambient Occlusion

Die Methode basiert auf einer Blickrichtungs- unabhängige Vorberechnung von Verdeckungen mittels des Ray-Tracings, mit anschließender Weiterverarbeitung der Informationen um (schnell) weiche Schatten in einer Umgebung zu berechnen.

Verdeckte Punkte werden hierbei abschattiert;

dafür muss jedoch erst einmal festgestellt werden, welche Objekte in einer Szene überhaupt verdeckt werden, und welche nicht.

Man kann das auch so ausdrücken, dass die Teile des Modells, die nicht für die Szene komplett sichtbar sind, abschattiert werden.



Ambient Occlusion

Wie wird das ganze nun realisiert? Erst einmal betrachten wir auf einer Oberfläche einen einzelnen Punkt. Über diesen Punkt spannen wir eine Hemisphäre in Richtung des Normalenvektors auf. Der Sinn der Hemisphäre ist es, den Strahlen, die wir von dem Punkt ausgehend aussenden wollen, eine logische Richtung vorzugeben.

Sonst hätte man unter Umständen den Effekt, dass die Strahlen in das Innere einer geschlossenen Geometrie hineinschießen, was keinen Sinn ergeben würde.

Wie gerade erwähnt, möchten wir nun von diesem Punkt aus Strahlen in beliebige Richtungen senden. Man stellt die Anzahl der Strahlen typischerweise über eine so genannte Sample-Frequenz ein. Vernünftige Anfangswerte fangen in aller Regel zwischen 64 und 128 Samples an.

Die Strahlen die wir aussenden möchten wir auch verfolgen können, deshalb nutzten wir das Ray-Tracing um eine Primärstrahlverfolgung vornehmen zu können.

Nun kommt der Clou an der ganzen Geschichte, trifft ein Teil der Strahlen ein Objekt in der Umgebung, so bedeutet das, dass dieses Objekt Einfluss auf meine betreffende Oberfläche nimmt. Der Strahl liefert mir in diesen Fall den Wert Eins zurück. Die Strahlen die hingegen nichts treffen, liefern mir den Wert Null zurück.

Anschließend wird die Anzahl der Strahlen, die Objekte getroffen haben gegen meine Anfangs-Samplerate gegen gerechnet, und das Ergebnis mit einem Vorweg definierten Farbwert multipliziert. Dieses Ergebnis wird dann wiederum vom definierten Farbwert abgezogen und wir erhalten einen neuen Farbwert für den betrachteten Bildpunkt.

Ein Beispiel:

Angenommen unsere Samplerate betrug 8; das heißt, wir haben 8 Strahlen von einem Pixel von einer Oberfläche ausgehend ausgesandt.

Des Weiteren definieren wir im Vorfeld einen Farbwert z.B. weiß und normalisieren diesen auf "1".

Nehmen wir weiter an, dort wo nix getroffen wird, haben wir die Farbe weiß, also den Wert Eins.

Wenn sich nun ein Objekt im Umfeld unserer Oberfläche befindet, und zum Beispiel zwei der Strahlen dieses Objekt treffen, bekommen wir zweimal den Wert Eins zurückgeliefert.

Daraus ergibt sich, wenn die Eingangs erwähnte Rechnung angewendet wird, folgendes:

2/8 = ¼ oder auch 0.25, das Ergebnis multipliziert mit dem normalisierten Farbwert also Eins, ergibt 0.25; dieser Wert wird nun von dem Anfangsfarbwert Eins abgezogen. Das Endergebnis ist 0.75.

Das heißt der Punkt den wir auf der Oberfläche betrachtet haben erhält den Farbwert 0.75; unser Anfangsfarbwert war bei Null als schwarz und bei Eins als weiß definiert; somit ergibt sich ein heller grauwert.

Anmerkung: Der schicke Roboter wurde von Marc Köhler entworfen und modelliert für den Kurzfilm Tellus. Vielen Dank nochmal an dieser Stelle!


Keine Kommentare: