Что такое w в вершинных шейдерах OpenGL и почему я делю на него?
-
19-09-2019 - |
Вопрос
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 (вершина).
Конечно, Красная книга - это определенный путеводитель: