Leí la respuesta aquí:
¿Qué hace la tarjeta gráfica con el cuarto elemento de un vector como posición final?
"El cuarto componente es un truco para realizar un seguimiento de la proyección en perspectiva. Cuando haces una proyección en perspectiva, quieres dividir por z: x '= x / z, y' = y / z, pero esta no es una operación que puede implementarse mediante una matriz de 3x3 que opera en un vector de x, y, z. El truco que se ha convertido en estándar para hacer esto es agregar una cuarta coordenada, w, y declarar que x, y, z siempre se dividirán por w después de aplicar todas las transformaciones y antes de la rasterización ".
pero no entendí por qué no podríamos dividir por z usando una matriz 3x3?
¿No podemos simplemente multiplicar por
1/z 0 0
0 1/z 0
0 0 1/z
Llegar [x/z y/z 1]
?
fuente
Respuestas:
Porque si solo divide
[x, y, z]
entrez
obtiene[x/z, y/z, 1]
y pierde el valor real dez
, lo cual es realmente útil si desea hacer un recorte de plano cercano / lejano o llenar un búfer Z.Por lo tanto, la mejor manera de mantener información sobre
z
, al menos en la GPU, es usar 4 componentes en lugar de 3. En la práctica, lo que está realmente en los dos últimos componentes del vector antes de la división en perspectiva depende de qué tipo de proyección y efectos desear.Por ejemplo, en el caso de una proyección en perspectiva, este es el vector resultante de 4 componentes:
Después de la perspectiva, dividir el vector se convierte en:
Y la
c + d/z
parte nos deja con suficiente información para llenar el búfer Z.fuente
Técnicamente, podrías hacer eso. ¿Pero por qué molestarse? Para cuando tengas esa final
z
, podrías:9 * sizeof(float)
bytes de espacio, gastando ciclos para calcular1/z
(una división) y luego haciendo nueve multiplicaciones y seis sumas para obtener su vértice final, oUno de estos me parece mucho más óptimo, y no es el primero. Incluso si existe hardware optimizado para la multiplicación de la matriz, como ciertamente lo hace, sigue siendo conceptualmente más complejo que una simple división.
Además, una matriz 3x3 no puede codificar una traducción, por lo que una matriz 4x4 (y, por lo tanto, la cuarta
w
coordenada) se usa antes en la tubería de todos modos . Esto significa que ya tiene ese cuarto componente sentado, por lo que también puede usarlo para transportar un valor útil y hacer su división con él.fuente