Computergrafik
Punktlichtquellen
← Blinn Phong in GLSL | ● | Abschwaechung →
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:
Vertex-Shader
uniform mat4x4 mv; // ModellView-Matrix
uniform mat4x4 mvp; // ModellViewProjection-Matrix
uniform mat4x4 mvit; // Inverse transponierte ModellView-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 -> Projezierte 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; // ModellViewProjection-Matrix
uniform mat4x4 mvit; // Inverse transponierte ModellView-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 -> Projezierte 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
const vec4 light...
ändern in varying vec4 light;
Hauptprogramm
vec4 light = view * vec4 (1, 2, 3, 1); // Licht an Weltkoordinaten (1,2,3)
lglUniformfv ("lightpos", light);
lglUniformfv ("lightpos", light);
← Blinn Phong in GLSL | ● | Abschwaechung →