SelfDXD von Martin Pyka
SelfDXD --- DirectXGraphic --- Licht und Schatten
Was ist Licht?
Einleitung
Zwei Arten von Licht
Lichtquellen
Materialien
Lichtberechnung

Einleitung

Nachdem wir jetzt 3D-Modelle selbst erstellen können, wollen wir uns mit diesem Kapitel ein wenig der Präsentation der Szene widmen, genauergesagt alles ins rechte Licht rücken. Bisher haben wir nur mit bereits beleuchteten Vertices gearbeitet, also Vertices, die keine Normale besitzen. Das hatte zur Folge, das alle Seiten eines 3D-Modells (Sie erinnern sich an die beiden Zylinder und an die gebogene Fläche) in genau den Farben angezeigt wurden, die wir definiert haben.

Beim Beleuchten einer Szene ist das ein wenig anders. Die Farben, die wir für die einzelnen Vertices angeben, gelten natürlich immer noch, aber darüberhinaus werden weitere Faktoren berücksichtigt, die letztendlich die Farbe des Pixels auf dem Bildschirm beeinflussen. Nun spielt die Normale eine Rolle, die angibt, wie ein Vertex zur Lichtquelle ausgerichtet ist. Hinzu kommen sogenannte Materialeigenschaften, mit denen man unter anderem bestimmen kann, wie stark ein 3D-Objekt Licht überhaupt reflektiert. Durch rein mathematische Berechnungen, um die sich zum Glück DirectXGraphics kümmert, können wir 3D-Objekte realistischer erscheinen lassen, in dem Licht- und Schattenbereiche die Form des Objektes akzentuieren.


Zwei Arten von Licht

In DirectXGraphics wird zwischen zwei Arten von Licht unterschieden. Dem ambienten Licht und dem direkten Licht. Letzteres definiert den Lichtanteil einer Fläche anhand der Distanz, der Ausrichtung und der Materialeigenschaften der Vertices. Direktes Licht besitzt eine Farbe, einen Intensitätsgrad und eine Richtung. Wenn die Richtung des Lichtes orthogonal zur Fläche ist, wird die Fläche natürlich am stärksten und hellsten angestrahlt. Je mehr sich die Fläche von der Lichtquelle abwendet, desto dunkler erscheint sie, bis sie schliesslich zur Schattenseite zugewendet ist. Das folgende Bild verdeutlicht den Effekt von direktem Licht.

Alles, was also nicht direkt zur Lichtquelle zugewendet ist, wird schwarz dargestellt. Wenn wir uns aber in unserer Umgebung umschauen, stellen wir fest, dass wir nicht alles im Pechschwarz sehen, nur weil es vielleicht nicht der Sonne zugewendet ist (zum Beispiel die Unterseite ihrer Hand). Jeder Bestandteil Ihres Zimmers, in dem Sie jetzt vielleicht grade sitzen, absorbiert Licht und reflektiert Licht. Das reflektierte Licht kann andere Objekte beleuchten, weshalb Sie Schattenseiten oftmals nur ein wenig dunkler sehen, als dem Licht zugewendete Seiten. Die Erfassung der tatsächlichen realistischen Lichtverhältnisse ist also ein komplexer mathematischer Prozess, der allenfalls für Raytracing-Programm verwendet wird. Um jedoch einen selben Effekt in Echtzeit berechnen zu können, verwendet DirectXGraphics das sogenannte ambiente Licht. Dieses Licht ist eine Grundhelligkeit, die überall vorherrscht. Das heisst also, selbst Flächen, die dem direkten Licht komplett abgewendet sind, können noch deutlich erkennbar dargestellt werden. So könnte unsere obere Kugel in Kombination von direktem und ambientem Licht so aussehen:

Bei diesem Bild ist durch das direkte Licht wieder erkennbar, aus welcher Richtung die Kugel angestrahlt wird. Da die Schattenseite jedoch mit einem ambienten Licht angestrahlt wird, lässt sich auch diese betrachten. Die Form des 3D-Körpers lässt sich also vollständig erfassen.


Lichtquellen

DirectXGraphics verwendet 3 Arten von Lichtquellen, die als direktes Licht auf das Objekt wirken können. Hier eine Grafik mit den englischen Bezeichnungen dafür:

Directional Light
Im Grunde sind hierbei alle Lichtstrahlen parallel zu einander. Es eignet sich besonders für sehr weit entfernte Objekte, wie der Sonne, da es hier kaum auffallen würde, wenn man das Directional Light durch das Point Light ersetzen würde.

Point Light
Dieses Lichquelle ist für alle unmittelbaren sich in der Nähe befindlichen Objekte relevant, also Kerzen, Strassenlaternen, Fackeln etc.

Spotlight
Spotlights kennen wir im wirklichen Leben aus dem Theater oder Zirkus. Aber auch Scheinwerfer und Taschenlampen funktionieren nach dem Spotlight-Prinzip. Dabei ist das Licht in eine Richtung gebündelt. Würde das Licht durch Rauch fallen, würde ein Art Kegelform entstehen.


Materialien

Neben den Eigenschaften des Lichtes können Sie auch noch dem Objekt, das beleuchtet wird, bestimmte Eigenschaften zuweisen. Dabei geht es darum, wie stark das Objekt das Licht absorbiert und welche Farben es reflektiert. Es gibt folgende Eigenschaften:

Diffuse: Gibt an, in wie weit der Rot-, Grün-, und Blauanteil des direkten Lichtes reflektiert werden soll. Angenommen, Sie lassen nur rotes Licht auf ein Objekt fallen, das aber nur Grünes reflektiert, so würde Ihr Objekt schwarz erscheinen. Wenn Sie angeben, dass alle Farben reflektiert werden sollen, erscheint Ihr Objekt in den Farben, in denen es angestrahlt wird.

Ambient: Gibt den Rot-, Grün, und Blauanteil an, den das Objekt vom ambienten Licht reflektiert.

Specular: Sie können Ihren Objekten eine Art Glanz geben. Dabei bestimmen Sie mit dem Specular-Wert, welche Farbe dieses Glanzlicht haben soll und wie stark es in der Reflektion auftreten soll. Der Specular-Wert kann zum Beispiel für Objekte eingesetzt werden, die metallisch oder poliert wirken sollen. Die untere Grafik verdeutlicht diesen Effekt.

Emissive: Desweiteren können Sie ihrem Objekt den Eindruck verleihen, es würde selbst leuchten. Mit dem Emissive-Wert bestimmen Sie die Farbe die Ihr Objekt in jedem Fall abgibt.


Lichtberechnung

DirectXGraphics berechnet nicht, wie Sie vielleicht denken könnten, den Lichtanteil für jeden einzelnen Pixel, sondern lediglich für die Ecken eines Dreiecks. Wie Sie wissen, besitzen Vertices eine Normale, die ihre Ausrichtung bestimmen. Durch die Ausrichtung der Normale und der Position, Entfernung und Art der Lichtquelle kann ermittelt werden, wie stark ein Vertex beleuchtet wird. Wenn nun die gesamte Fläche eines Dreiecks beleuchtet werden soll, wird der Lichtanteil jedes einzelnen Pixels der Dreiecksfläche nicht anhand seiner Ausrichtung und der Lichquelle errechnet, sondern aus den Lichtinformationen der drei Vertices, die das Dreieck bilden. Die folgende Grafik verdeutlicht es nochmal:

Eine quadratische Fläche wird in der Mitte mit einem Spotlight angestrahlt. Im linken Beispiel besteht diese Fläche nur aus 9 Vertices. Lediglich der mittlere Vertex wird vom Spotlight getroffen, die anderen 8 Vertices nicht. Obwohl der Radius des Spotlight wesentlich kleiner ist, als die quadratische Fläche, werden weite Teile der Fläche heller dargestellt, weil die Vertices soweit auseinanderliegen. (Farbabstufungen gibt es dabei aber nicht! Das liegt am Gif-Format!)

Im rechten Beispiel ist die Zahl der Vertices deutlich höher. Es werden mehrere Vertices vom Spotlight getroffen. Dabei besitzen diese Vertices unterschiedliche Lichtanteile. Aufgrund der vielen nah beieinanderliegenden Vertices ist die Form des Spotlights gut zu erkennen.

Diese Berechnungstechnik ist natürlich wesentlich schneller als eine Pixel-für-Pixel Berechnung. Jedoch müssen Sie, wie das obere Beispiel zeigt, immer darauf achten, wieviele Vertices Sie für ein 3D-Objekt einsetzen, wenn Sie ein Spotlight oder ein Point Light verwenden. Würden Sie Directional Light verwenden, hätten Sie die quadratische Fläche auch nur mit 4 Vertices bilden können, da Lichteinfall und -intensität an jeder Stelle im Raum gleich sind.