Computergrafik
Punktlichtquellen
← Blinn Phong in GLSL | ● | Quadratische Abschwächung →
Bei Punktlichtquellen verändert sich lediglich die Berechnung des Licht-Vektors; die Position der Punktlichtquelle wird jetzt als reguläre Position in Augenkoordinaten als vec4 übergeben. Dazu muss die typ. in Weltkoordinaten gegebene Lichtposition erst (normalerweise im Hauptprogramm und nicht im Shader) in Augenkoordinaten umgerechnet werden:
Hauptprogramm
vec4 lightpos = V * vec4 (1, 2, 3, 1); // Position der Lichtquelle in Weltkoordinaten
lglUniformfv ("lightpos", light);
lglUniformfv ("lightpos", light);
Vertex-Shader
uniform mat4x4 mv; // ModelView-Matrix
uniform mat4x4 mvp; // ModelViewProjection-Matrix
uniform mat4x4 mvit; // Inverse transponierte ModelView-Matrix
uniform vec4 lightpos; // Position der Lichtquelle in Augenkoordinaten
attribute vec4 vertex_position;
attribute vec3 vertex_normal;
// Ausgabe für den Fragment-Shader
varying vec3 normal, light, halfway;
void main()
{
// Vertex Trafo -> Projizierte Koordinaten (Clipkoordinaten)
gl_Position = mvp * vertex_position;
// Normalen Trafo -> Augenkoordinaten
// Werden nicht durch Translationen verändert -> 3x3 Matrix reicht
normal = normalize (mat3x3 (mvit) * vertex_normal);
// View-Vektor berechnen - Vertex in Augenkoordinaten, nur umgedreht
vec3 view = normalize (- vec3 (mv * vertex_position));
// Lichtrichtung berechnen
light = normalize (vec3 (lightpos - mv * vertex_position));
// Halfway-Vektor für Spekulares Hilight
halfway = normalize (view + light);
}
uniform mat4x4 mvp; // ModelViewProjection-Matrix
uniform mat4x4 mvit; // Inverse transponierte ModelView-Matrix
uniform vec4 lightpos; // Position der Lichtquelle in Augenkoordinaten
attribute vec4 vertex_position;
attribute vec3 vertex_normal;
// Ausgabe für den Fragment-Shader
varying vec3 normal, light, halfway;
void main()
{
// Vertex Trafo -> Projizierte Koordinaten (Clipkoordinaten)
gl_Position = mvp * vertex_position;
// Normalen Trafo -> Augenkoordinaten
// Werden nicht durch Translationen verändert -> 3x3 Matrix reicht
normal = normalize (mat3x3 (mvit) * vertex_normal);
// View-Vektor berechnen - Vertex in Augenkoordinaten, nur umgedreht
vec3 view = normalize (- vec3 (mv * vertex_position));
// Lichtrichtung berechnen
light = normalize (vec3 (lightpos - mv * vertex_position));
// Halfway-Vektor für Spekulares Hilight
halfway = normalize (view + light);
}
Fragment-Shader
varying vec3 light; // für diffusen Anteil