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);
}

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);


Blinn Phong in GLSL | | Abschwaechung

Options: