Зачем нам нужна четвертая координата для деления на z?

12

Я прочитал ответ здесь:

Что делает видеокарта с четвертым элементом вектора в качестве конечной позиции?

«Четвертый компонент - это хитрость для отслеживания перспективного проецирования. Когда вы делаете перспективное проецирование, вы хотите разделить на z: x '= x / z, y' = y / z, но это не та операция, которая может быть реализован с помощью матрицы 3x3, работающей с вектором x, y, z. Стандартом, который стал стандартным для этого, является добавление четвертой координаты w и объявление, что x, y, z всегда будет делиться на w после всех преобразований и перед растеризацией ".

но я не понял, почему мы не можем разделить на z с использованием матрицы 3x3?

мы не можем просто умножить на

1/z 0 0
0 1/z 0
0 0 1/z

получить [x/z y/z 1]

?

Сообщество
источник
Попробуйте выразить преобразование (или композицию преобразований), которое включает перевод где-нибудь в цепочке. Без значения w вы не можете выразить это в одной матрице.
DMGregory
Я действительно понимаю часть перевода, но я просто не понимаю, как добавление четвертой координаты поможет или это трюк для деления на z
За то, что оно того стоит, ты можешь сделать то, что сказал. Разделение x и y на z является допустимым методом преобразования трехмерных координат в двухмерное экранное пространство с проекцией, в которой удаленные объекты становятся меньше. W - это однородная координата, которая переводит ее в четвертое измерение, чтобы иметь возможность выполнять перевод.
Алан Вульф

Ответы:

14

Потому что, если вы делите только [x, y, z]на то, что zвы получили, [x/z, y/z, 1]и вы потеряли фактическое значение z, что на самом деле полезно, если вы хотите сделать отсечение в ближней / дальней плоскости или заполнить Z-буфер.

Поэтому лучший способ сохранить некоторую информацию о z, по крайней мере, графическом процессоре, - это использовать 4 компонента вместо 3. На практике то, что на самом деле находится в последних двух векторных компонентах перед разделением перспективы, зависит от того, какую проекцию и какие эффекты вы используете. хочу.

Например, в случае перспективной проекции это результирующий 4-компонентный вектор:

| a 0 0 0 |   | x |   |   ax   |
| 0 b 0 0 |   | y |   |   by   |
| 0 0 c d | × | z | = | cz + d |
| 0 0 1 0 |   | 1 |   |    z   |

После деления перспективы вектор становится:

|  ax/z   |
|  by/z   |
| c + d/z |
|    1    |

И эта c + d/zчасть оставляет нам достаточно информации для заполнения буфера Z.

Сэм Хоцевар
источник
Вы можете разделить только X и Y на Z, получая [x / z, y / z, z]. Графический процессор не должен делить векторное деление, он мог бы быть рассчитан на любые вычисления.
user253751 10.07.15
3

Технически, вы могли бы сделать это. Но зачем? К тому времени, когда у вас будет этот финал z, вы можете:

  • создайте матрицу 3x3, как вы описали, тратя 9 * sizeof(float)байты пространства, тратя циклы на вычисления 1/z(одно деление), а затем выполняя девять умножений и шесть добавлений, чтобы получить свою окончательную вершину, или
  • Вы можете сделать три деления, как это делает современный трубопровод

Один из них кажется мне гораздо более оптимальным, и он не первый. Даже если существует оптимизированное аппаратное обеспечение для умножения матрицы, как это, безусловно, существует, концептуально оно все же более сложно, чем простое деление.

Кроме того, матрица 3x3 не может кодировать трансляцию, поэтому матрица 4x4 (и, следовательно, четвертая wкоордината) в любом случае используется ранее в конвейере . Это означает, что у вас уже есть четвертый компонент, так что вы можете использовать его для передачи полезной ценности и деления с ней.


источник