Der Halbvektor wird bei spiegelnder Beleuchtung verwendet und stellt die Normale an Mikrofehlern in der Oberfläche dar, die dazu führen würden, dass das einfallende Licht zum Betrachter reflektiert wird. Je näher der Halbvektor an der Oberflächennormale liegt, desto mehr Unebenheiten werden mit der tatsächlichen Oberflächennormale ausgerichtet. Glattere Oberflächen haben weniger Unvollkommenheiten, die von der Oberflächennormalen wegzeigen, und führen zu einem schärferen Glanzlicht mit einem stärkeren Lichtabfall, wenn sich der Halbvektor von der tatsächlichen Normalen entfernt, als eine rauere Oberfläche. Die Stärke des Lichtabfalls wird durch den Spiegelungsterm gesteuert, der die Potenz ist, mit der der Kosinus zwischen dem Halbvektor und dem Normalenvektor genommen wird, so dass glattere Oberflächen eine höhere Potenz haben.
Wir nennen ihn den Halbvektor (H), weil er auf halbem Weg zwischen dem Vektor, der zum Licht zeigt (Lichtvektor, L), und dem Vektor, der zum Betrachter zeigt (Augenposition (0,0,0) minus Scheitelpunktposition im Augenraum; Sichtvektor, V), liegt. Bevor Sie H berechnen, vergewissern Sie sich, dass der Vektor zum Licht und der zum Auge im gleichen Koordinatenraum liegen (das alte OpenGL verwendet den Augenraum).
H = normalize( L + V )
Sie haben die richtige Berechnung durchgeführt, aber Ihre Variablen könnten angemessener benannt werden. Der Begriff light_position ist hier nicht ganz korrekt, da es sich bei dem von Ihnen zitierten Tutorial um das Tutorial für gerichtete Lichter handelt, die per Definition keine Position haben. Der Lichtvektor für gerichtete Lichter ist unabhängig vom Scheitelpunkt, also haben Sie hier ein paar Gleichungen kombiniert. Denken Sie daran, dass der Lichtvektor in Richtung des Lichts verläuft, also entgegengesetzt zum Photonenfluss des Lichts.
// i'm keeping your term here... I'm assuming
// you wanted to simulate a light coming from that position
// using a directional light, so the light direction would
// be -light_position, making
// L = -(-light_position) = light_position
vec3 L = light_position;
// For a point light, you would need the direction from
// the point to the light, so instead it would be
// light_position - outVertex
vec3 V = -out_Vertex;
// really it is (eye - vertexPosition), so (0,0,0) - out_Vertex
vec3 H = normalize(L + V);