Потому что вам нужна координата w для расчета перспективы. После вывода из вершинного шейдера DirectX выполняет деление перспективы путем деления на w.
По существу, если в качестве выходной позиции вершины у вас есть 32768, -32768, 32768, 65536, то после деления w вы получите 0,5, -0,5, 0,5, 1. В этот момент w можно отбросить, поскольку он больше не нужен. Затем эта информация передается через матрицу видового экрана, которая преобразует ее в пригодные для использования 2D-координаты.
Редактировать: если вы посмотрите, как выполняется умножение матриц с использованием проекционной матрицы, вы увидите, как значения размещаются в правильных местах.
Взятие матрицы проекции, указанной в D3DXMatrixPerspectiveLH
2*zn/w 0 0 0
0 2*zn/h 0 0
0 0 zf/(zf-zn) 1
0 0 zn*zf/(zn-zf) 0
И, применяя его к случайным x, y, z, 1 (примечание для позиции вершины w всегда будет 1), для входного значения вершины вы получите следующее
x' = ((2*zn/w) * x) + (0 * y) + (0 * z) + (0 * w)
y' = (0 * x) + ((2*zn/h) * y) + (0 * z) + (0 * w)
z' = (0 * x) + (0 * y) + ((zf/(zf-zn)) * z) + ((zn*zf/(zn-zf)) * w)
w' = (0 * x) + (0 * y) + (1 * z) + (0 * w)
Мгновенно вы можете видеть, что w и z различны. Координата w теперь содержит только координату z, переданную в матрицу проекции. z содержит нечто гораздо более сложное.
Итак ... предположим, что у нас есть входная позиция (2, 1, 5, 1), zn (Z-Near) равен 1, а zf (Z-Far равен 10) и aw (ширина) равен 1 и ах (высота) 1.
Проходя через эти значения, мы получаем
x' = (((2 * 1)/1) * 2
y' = (((2 * 1)/1) * 1
z' = ((10/(10-1) * 5 + ((10 * 1/(1-10)) * 1)
w' = 5
расширяя, что мы тогда получим
x' = 4
y' = 2
z' = 4.4
w' = 5
Затем мы выполняем окончательное разделение перспективы и получаем
x'' = 0.8
y'' = 0.4
z'' = 0.88
w'' = 1
И теперь у нас есть окончательная координата. Предполагается, что x и y находятся в диапазоне от -1 до 1, а z - от 0 до 1. Как вы можете видеть, вершина отображается на экране.
В качестве странного бонуса вы можете видеть, что если | x '| или | у '| или | z '| больше чем | w '| или z 'меньше 0, что вершина находится вне экрана. Эта информация используется для отсечения треугольника на экране.
В любом случае, я думаю, что это довольно исчерпывающий ответ: D
Edit2: будьте осторожны, я использую основные матрицы ROW. Основные матрицы столбцов транспонированы.