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

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

Fragment-Shader

varying vec3 light;   // für diffusen Anteil


Blinn Phong in GLSL | | Quadratische Abschwächung

Options: