Beleuchtung der Oberflächen

Autor: Victor Brinkhege

Blinn-Beleuchtungsmodell

Plantex benutzt für die Beleuchtung der Oberflächen das Blinn-Beleuchtungsmodell. Es ist eine Erweiterung des aus der Computergrafik Vorlesung bekannten Phong-Beleuchtungsmodells.

Zur Erinnerung: Bein Phong-Beleuchtungsmodell wird das reflektierte Licht auf einer Oberfläche in ambiente, diffuse und spekulare Komponenten unterteilt.

  • Ambientes Licht modelliert eine Grundhelligkeit, die von der Umgebung ausgeht.
  • Diffuses Licht basiert auf dem Phänomen der Streuung. Es gibt der Materialfarbe des Objekts einem Helligkeit, dessen Intensität vom Einfallswinkel des eintreffenden Lichtes abhängt.(Quelle: Vorlesung)
  • Spektrales Licht beschreibt das von der Oberfläche reflektierte Licht.

Die Lichtberechnung in unseren Shadern läuft in etwa so ab:

Gegeben sind eine Materialfarbe x_material_color, die Normalen der Oberflächen real_normal und eine Konstante für ambientes Licht ambient.

Der diffuse Farbton entsteht aus der Materialfarbe. Wir benutzen hierfür auch eine Textur, das hat allerdings nichts mit der eigentlichen Lichtberechnung zu tun. Mehr dazu im vorigen Kapitel 8: Texturierung.

diffuse_color = texture(sand_texture, x_tex_coords).rgb;
diffuse_color *= x_material_color;

Die diffuse Lichtkomponente kDk_D entsteht wie folgt:

// Calculate diffuse light component
float diffuse = max(0.0, dot(-normalize(halfway_vector), real_normal));

Mehr Informationen zum halway_vector finden sich weiter unten.

Während beim klassischen Phong-Modell in jedem Durchlauf aufwändig der Reflektionsvektor RR für jedes Oberflächenfragment ausgerechnet wird, bietet das Blinn-Beleuchtungsmodell einen effizienteren Weg der Lichtberechnung an: In dieser Variante wird eine Winkelhalbierende HH berechnet, mit der man den Cosinus zwisch der Normalen NN und HH berechnen kann. Dadurch kann die spekulare Lichtberechnung deutlich schneller erfolgen.

H=V+LV+L H = \frac{V + L}{||V + L||} Hierbei ist VV der normierte Vektor vom Fragment zur Kamera und LL der normalisierte Vektor vom Fragment zur Lichtquelle

In unserem Code ist die Berechnung der Winkelhalbierenden allerdings besonders einfach, da die Kamera (bzw. der Spieler) immer die Position (0, 0, 0) hat. Wir müssen deshalb nur den negativen Positionsvektor der Sonne benutzen:

let halway_vector = (-sun.position().to_vec()).normalize();

Die spekulare Komponente wird dann einfach so berechnet:

float specular = pow(max(dot(halfway_vector, real_normal), 0.0), 16.0);

Das Blinn-Beleuchtungsmodell ist in unserem Fall dadurch besonders performant.

Der Exponent 16.0 ist das Pendant zum spekularen Exponenten im Phong-Modell und sollte idealerweise von der Oberflächenbeschaffenheit abhängen.

Schlussendlich werden die Komponenten mit den Farben multipliziert und dann addiert.

color = ambient * diffuse_color + diffuse * diffuse_color + specular * diffuse color;

Im Zusammenspiel mit der Schattenberechnung ist das Ergebnis ist eine annähernd realistische Beleuchtung. Die Details der Schattenberechnung wurden in diesem Kapitel ignoriert. Mehr dazu im folgenden Kapitel 9: Schatten.

results matching ""

    No results matching ""