Computergrafik

Abschwächung

Punktlichtquellen | | Lichtquellen zeichnen

Die Intensität von Punktlichtquellen nimmt mit der Entfernung ab (physikalisch korrekt: quadratisch).

Dies läßt sich entsprechend modellieren, wenn der lightvektor 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” (hier 3) berücksichtigt werden, bei der das Licht noch mit voller Stärke strahlt, und es darf die Distanz nicht 0 werden (Divide by zero error):

Vertex-Shader

varying vec3 light, normal;
...
light  = vec3 (light - mv * gl_Vertex);

Fragment-Shader

varying vec3 light, normal;
...
float dist = length (light);
vec3 l = light / dist;
dist = max (dist/3, .1);
dist = dist*dist;
...
Id = max (dot (l, n), 0);
...
vec4 col = Ca + Ce + (Cd * Id + Cs * Is) / dist;

In der Praxis wird eher mit 1/dist gearbeitet (multiplizieren ist schneller als dividieren…).

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

Options: