Половинный вектор используется в зеркальном освещении и представляет собой нормаль при микродерфектурах на поверхности, которые могут привести к отражению входящего света в направлении зрителя.Когда половинный вектор ближе к нормали поверхности, большее количество дефектов выравнивается с фактической нормалью поверхности.Более гладкие поверхности будут иметь меньше дефектов, направленных в сторону от нормали поверхности, и приведут к более резкому выделению с более значительным падением света, поскольку половинный вектор отходит от фактической нормали, чем более грубая поверхность.Величина спада контролируется зеркальным слагаемым, которое является степенью, в которую берется косинус между половинным вектором и вектором нормали, поэтому более гладкие поверхности имеют более высокую мощность.-вектор (H), потому что он находится на полпути между векторной точкой для света (вектор света, L) и вектором, указывающим на зрителя (который является положением глаза (0,0,0) минус положение вершины в глазупространство, вид вектора, V).Прежде чем вычислять H, убедитесь, что вектор света и глаза находятся в одном и том же координатном пространстве (устаревшее OpenGL использовало пространство глаз).
H = normalize( L + V )
Вы сделали правильный расчет, но ваши переменные могут бытьназван более подходящим.Термин light_position здесь не совсем корректен, так как приведенный вами урок является уроком о Направленном освещении, который по определению не имеет положения.Вектор света для направленных источников света не зависит от вершины, поэтому здесь вы объединили несколько уравнений.Имейте в виду, что световой вектор направлен к свету, поэтому противоположен потоку фотонов от света.
// 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);