Im Vertex Shader multiplizierst du die Vertex Position mit der Projektionsmatrix, Viewmatrix und Modelmatrix. Das transformiert die Vertex Position in Normalized Device Coordinates. Das braucht OpenGL um effizient entscheiden zu können ob etwas sichtbar ist und welche Fragmente von einem Face tatsächlich betroffen sind.
Für deine Lichtberechnungen ist das jedoch nicht hilfreich, da bei der Multiplikation mit der Projektionsmatrix der Raum verzerrt wird. Zumindest wüsste ich nicht, wie man in NDCs Licht berechnen könnte.
Du solltest dir also überlegen deine Lichtberechnungen entweder im Welt-Koordinatensystem (World space) oder im Kamera-Koordinatensystem (View space) zu berechnen.
Eine Multiplikation mit der Modelmatrix bringt dich in das Welt-Koordinatensystem. Wenn du das Ergebnis dann noch mit der Viewmatrix multiplizierst bist du im Koordinatensystem der Kamera.
Du könntest also z.B. um das Licht im Kamera-Koordinatensystem zu berechnen im Vertex Shader folgendes tun:
Code: Alles auswählen
vec4 viewPosition = cameraView * model * vec4(vertexPosition,1);
gl_Position = projektionsMatrix * viewPosition;
fragVert.xyz = viewPosition.xyz;
Im Fragment Shader musst du dann natürlich noch sicher stellen, dass deine Lichtposition auch im Koordinatensystem der Kamera ist. Wenn du also die Position des Lichtes in Welt Koordinaten hast, dann musst du die Position vor der Übergabe an den Shader noch mit der Viewmatrix multiplizieren.
Noch eine Sache, die nicht direkt mit deinem Problem zu tun hat, aber für später vielleicht auch gut zu Wissen ist:
Wenn man eine Berechnung nicht im Shader machen muss, weil das Ergebnis für alle Durchläufe des Shaders immer gleich ist sollte man es schon auf der CPU berechnen. Das ist eigentlich immer schneller. Die Multiplikation von View- und Modelmatrix wäre so eine Sache. Und noch deutlich kritischer, da momentan im Fragment Shader: Die Berechnung der Normalmatrix.