Computergrafik

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

light = vec3 (light - mv * gl_Vertex);

Fragment-Shader

varying vec3 light, normal;
...
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:

att = 1 / (1 + c*dot(light, light));

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:

att = 1 / dist;


Punktlichtquellen | | Lichtquellen zeichnen

Options: