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
...
light = vec3 (light - mv * gl_Vertex);
Fragment-Shader
...
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 →