В вершинных шейдерах OpenGL что такое w и почему я делю на него? - PullRequest
36 голосов
/ 11 марта 2010
void main(void)
{
  vec4 clipCoord = glModelViewProjectionmatrix * gl_Vertex;
  gl_Position = clipCoord;

  gl_FrontColor = gl_Color;

  vec3 ndc = clipCoord.xyz / clipCoord.w;

Так что clipCoord просто выполняет стандартные преобразования с фиксированным конвейером. Почему я делю на w, и что я получу от этого?

1 Ответ

39 голосов
/ 11 марта 2010

W - четвертая координата трехмерной вершины; Эта вершина называется однородной координатой вершины.

В двух словах, компонент W - это фактор, который делит другие компоненты вектора. Когда W равно 1,0, однородные координаты вершины «нормализуются». Чтобы сравнить две вершины, вы должны нормализовать значение W до 1,0.

Подумайте о вершине (1,1,1,1). Теперь увеличьте значение W (w> 1,0). Нормализованная позиция масштабируется! и это идет к началу. Подумайте о вершине (1,1,1,1). Теперь уменьшите значение W (W <1,0). Нормализованная позиция приближается к бесконечной точке. </p>

Помимо масштабирования координат вершин, необходима координата W, поскольку необходимо умножить матрицу 4x4 (вид модели и / или матрицы проекций) на матрицу 4x1 (вершина).

Конечно, Красная книга - это определенное руководство:

Приложение к Красной книге

...