J'ai lu la réponse ici:
Que fait la carte graphique avec le quatrième élément d'un vecteur comme position finale?
"Le quatrième composant est une astuce pour garder une trace de la projection en perspective. Lorsque vous effectuez une projection en perspective, vous voulez diviser par z: x '= x / z, y' = y / z, mais ce n'est pas une opération qui peut être implémenté par une matrice 3x3 fonctionnant sur un vecteur de x, y, z. L'astuce qui est devenue standard pour ce faire est d'ajouter une quatrième coordonnée, w, et de déclarer que x, y, z sera toujours divisé par w après l'application de toutes les transformations et avant la pixellisation. "
mais je ne comprenais pas pourquoi ne pouvions-nous pas diviser par z en utilisant une matrice 3x3?
ne pouvons-nous pas simplement multiplier par
1/z 0 0
0 1/z 0
0 0 1/z
obtenir [x/z y/z 1]
?
la source
Réponses:
Parce que si vous ne divisez que
[x, y, z]
parz
vous obtenez[x/z, y/z, 1]
et vous avez perdu la valeur réelle dez
, ce qui est réellement utile si vous voulez effectuer un écrêtage dans le plan proche / lointain ou remplir un Z-buffer.La meilleure façon de conserver des informations
z
, au moins sur le GPU, est donc d'utiliser 4 composants au lieu de 3. En pratique, ce qui se trouve réellement dans les deux derniers composants vectoriels avant la division en perspective dépend du type de projection et d'effets que vous vouloir.Par exemple, dans le cas d'une projection en perspective, il s'agit du vecteur à 4 composantes résultant:
Après la division de la perspective, le vecteur devient:
Et la
c + d/z
partie nous laisse suffisamment d'informations pour remplir le tampon Z.la source
Techniquement, vous pourriez le faire. Mais pourquoi s'embêter? Au moment où vous avez cette finale
z
, vous pouvez soit:9 * sizeof(float)
octets d'espace, en dépensant des cycles pour calculer1/z
(une division) et en faisant ensuite neuf multiplications et six ajouts pour obtenir votre sommet final, ouL'un d'eux me semble beaucoup plus optimal, et ce n'est pas le premier. Même s'il existe du matériel optimisé pour la multiplication matricielle, comme c'est certainement le cas, il reste conceptuellement plus complexe qu'une simple division.
De plus, une matrice 3x3 ne peut pas coder une traduction, et donc une matrice 4x4 (et donc la quatrième
w
coordonnée) est utilisée plus tôt dans le pipeline de toute façon . Cela signifie que vous disposez déjà de ce quatrième composant, vous pouvez donc aussi l'utiliser pour transporter une valeur utile et faire votre division avec.la source