Abschwächung
← Punktlichtquellen | ● | Lichtquellen zeichnen →
Die Intensität von Punktlichtquellen nimmt mit der Entfernung ab (physikalisch korrekt: quadratisch).
Dies läßt sich entsprechend implementieren, wenn der Lichtvektor erst im Fragment-Shader normalisiert wird; da wir die Entfernung benötigen, normalisieren wir den Vektor “von Hand” und nicht mit normalize()
.
Dabei muss die “Standard-Entfernung” (std_dist) berücksichtigt werden, bei der das Licht noch mit voller Stärke strahlt, und es darf die Distanz nicht 0 werden (Division durch Null):
Vertex-Shader
Fragment-Shader
...
float dist = length (light);
vec3 l = light / dist;
dist = max (dist / std_dist, 0.01);
float att = 1 / dist*dist;
...
Id = max (dot (l, n), 0);
...
vec4 col = Ca + (Cd * Id + Cs * Is) * att;
Alternativ kann auch eine quadratische Formel mit Abschwächungskoeffizient $c$ verwendet werden:
Ein quadratischer Abfall ist zwar physikalisch korrekt, aber meistens zu extrem, um zu guten Ergebnissen zu führen. Oft wird daher ein linearer Abfall benutzt:
← Punktlichtquellen | ● | Lichtquellen zeichnen →