Что такое Половинный вектор в современном GLSL? - PullRequest
5 голосов
/ 19 сентября 2010

http://www.lighthouse3d.com/opengl/glsl/index.php?ogldir2 сообщает, что половина вектора в контексте OpenGL - это «Положение глаза - Светлая позиция», но затем он говорит: «К счастью, OpenGL рассчитывает это для нас» [что сейчас не рекомендуется].

Как, на самом деле, можно рассчитать (простой пример был бы очень признателен) [главным образом, меня удивляет, что такое "Глаз" и как его можно получить].

На данный момент мне удалось заставить зеркальные вычисления работать (с хорошим визуальным результатом) с половинным вектором, равным Свету, где Свет равен

vec3 Light = normalize(light_position - vec3(out_Vertex));

Теперь я понятия не имею, почему это сработало.

[Если бы я хотя бы знал, что такое «Глаз» и как его можно получить практически.]

Ответы [ 2 ]

6 голосов
/ 09 сентября 2014

Половинный вектор используется в зеркальном освещении и представляет собой нормаль при микродерфектурах на поверхности, которые могут привести к отражению входящего света в направлении зрителя.Когда половинный вектор ближе к нормали поверхности, большее количество дефектов выравнивается с фактической нормалью поверхности.Более гладкие поверхности будут иметь меньше дефектов, направленных в сторону от нормали поверхности, и приведут к более резкому выделению с более значительным падением света, поскольку половинный вектор отходит от фактической нормали, чем более грубая поверхность.Величина спада контролируется зеркальным слагаемым, которое является степенью, в которую берется косинус между половинным вектором и вектором нормали, поэтому более гладкие поверхности имеют более высокую мощность.-вектор (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);
4 голосов
/ 19 сентября 2010

В фрагментном шейдере координаты вершины можно рассматривать как вектор, который идет от камеры (или «глаза» зрителя) к текущему фрагменту, поэтому, изменяя направление этого вектора, мы получаем «Глаз» -вектор вы ищете. При расчете полувектора также необходимо учитывать направление вектора положения света: на веб-странице, на которую вы ссылаетесь, они указываются при наведении на поверхность, при http://en.wikipedia.org/wiki/Blinn%E2%80%93Phong_shading_model - на ее указание в сторону от поверхности.

...