Ich habe die Antwort hier gelesen:
Was macht die Grafikkarte mit dem vierten Element eines Vektors als Endposition?
"Die vierte Komponente ist ein Trick, um die perspektivische Projektion im Auge zu behalten. Wenn Sie eine perspektivische Projektion durchführen, möchten Sie durch z dividieren: x '= x / z, y' = y / z, aber dies ist keine Operation, die kann durch eine 3x3-Matrix implementiert werden, die mit einem Vektor von x, y, z arbeitet. Der zum Standard gewordene Trick besteht darin, eine vierte Koordinate w anzufügen und zu deklarieren, dass x, y, z immer durch w geteilt wird nach dem Anwenden aller Transformationen und vor dem Rastern. "
aber ich habe nicht verstanden, warum wir mit einer 3x3-Matrix nicht durch z teilen konnten?
können wir nicht einfach multiplizieren mit
1/z 0 0
0 1/z 0
0 0 1/z
bekommen [x/z y/z 1]
?
quelle
Antworten:
Denn wenn man nur teilen ,
[x, y, z]
indemz
Sie erhalten[x/z, y/z, 1]
und verloren Sie den tatsächlichen Wertz
, die tatsächlich nützlich ist , wenn Sie in der Nähe von / ferner Ebene Clipping machen wollen oder einen Z-Puffer füllen.Der beste Weg, um
z
zumindest Informationen über die GPU zu erhalten, besteht daher darin, 4 statt 3 Komponenten zu verwenden. In der Praxis hängt es von der Art der Projektion und den Effekten ab, was sich in den letzten beiden Vektorkomponenten vor der Perspektiventrennung befindet wollen.Bei einer perspektivischen Projektion ist dies beispielsweise der resultierende 4-Komponenten-Vektor:
Nach der perspektivischen Teilung wird der Vektor:
Und das
c + d/z
Teil liefert uns genug Informationen, um den Z-Puffer zu füllen.quelle
Technisch könnte man das machen. Aber warum sich die Mühe machen? Wenn Sie das Finale
z
erreicht haben, können Sie entweder:9 * sizeof(float)
Bytes an Speicherplatz, verbringen Sie Rechenzyklen1/z
(eine Division) und führen Sie dann neun Multiplikationen und sechs Additionen durch, um Ihren endgültigen Scheitelpunkt zu erhalten, oderEine davon scheint mir weitaus optimaler zu sein, und es ist nicht die erste. Auch wenn optimierte Hardware für die Matrix-Multiplikation vorhanden ist, ist sie, wie es mit Sicherheit der Fall ist, konzeptionell immer noch komplexer als eine einfache Aufteilung.
Außerdem kann eine 3x3-Matrix keine Übersetzung codieren, sodass eine 4x4-Matrix (und damit die vierte
w
Koordinate) ohnehin früher in der Pipeline verwendet wird . Das heißt, Sie haben bereits die vierte Komponente dort, sodass Sie sie auch zum Transportieren eines nützlichen Werts und zur Aufteilung verwenden können.quelle