void main(void)
{
vec4 clipCoord = glModelViewProjectionmatrix * gl_Vertex;
gl_Position = clipCoord;
gl_FrontColor = gl_Color;
vec3 ndc = clipCoord.xyz / clipCoord.w;
Так clipCoord
просто делает стандарт, который преобразовывает починенный конвейер. Почему я делюсь на w
, и что я получаю от этого?
W - четвертая координата трехмерной вершины; Эта вершина называется однородной координатой вершины.
Вкратце, компонент W - это коэффициент, который делит другие компоненты вектора. Когда W равно 1.0, однородные координаты вершины «нормализованы». Чтобы сравнить две вершины, вы должны нормализовать значение W до 1.0.
Подумайте о вершине (1,1,1,1). Теперь увеличьте значение W (w> 1.0). Нормализованное положение масштабируется! и он идет к источнику. Подумайте о вершине (1,1,1,1). Теперь уменьшите значение W (W <1.0). Нормализованное положение стремится к бесконечности.
Помимо масштабирования координат вершин, координата W необходима, так как вы должны умножить матрицу 4x4 (вид модели и / или матрицы проекции) на матрицу 4x1 (вершина).
Конечно, Красная книга - это определенное руководство: