Я прочитал ответ здесь:
Что делает видеокарта с четвертым элементом вектора в качестве конечной позиции?
«Четвертый компонент - это хитрость для отслеживания перспективного проецирования. Когда вы делаете перспективное проецирование, вы хотите разделить на 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]
?
matrix
transformation
projection-matrix
Сообщество
источник
источник
Ответы:
Потому что, если вы делите только
[x, y, z]
на то, чтоz
вы получили,[x/z, y/z, 1]
и вы потеряли фактическое значениеz
, что на самом деле полезно, если вы хотите сделать отсечение в ближней / дальней плоскости или заполнить Z-буфер.Поэтому лучший способ сохранить некоторую информацию о
z
, по крайней мере, графическом процессоре, - это использовать 4 компонента вместо 3. На практике то, что на самом деле находится в последних двух векторных компонентах перед разделением перспективы, зависит от того, какую проекцию и какие эффекты вы используете. хочу.Например, в случае перспективной проекции это результирующий 4-компонентный вектор:
После деления перспективы вектор становится:
И эта
c + d/z
часть оставляет нам достаточно информации для заполнения буфера Z.источник
Технически, вы могли бы сделать это. Но зачем? К тому времени, когда у вас будет этот финал
z
, вы можете:9 * sizeof(float)
байты пространства, тратя циклы на вычисления1/z
(одно деление), а затем выполняя девять умножений и шесть добавлений, чтобы получить свою окончательную вершину, илиОдин из них кажется мне гораздо более оптимальным, и он не первый. Даже если существует оптимизированное аппаратное обеспечение для умножения матрицы, как это, безусловно, существует, концептуально оно все же более сложно, чем простое деление.
Кроме того, матрица 3x3 не может кодировать трансляцию, поэтому матрица 4x4 (и, следовательно, четвертая
w
координата) в любом случае используется ранее в конвейере . Это означает, что у вас уже есть четвертый компонент, так что вы можете использовать его для передачи полезной ценности и деления с ней.источник