Warum brauchen wir eine vierte Koordinate, um durch z zu teilen?


12

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]

?


Versuchen Sie, eine Transformation (oder Zusammensetzung von Transformationen) auszudrücken, die irgendwo in der Kette eine Übersetzung enthält. Ohne einen Wert kann man ihn nicht in einer einzelnen Matrix ausdrücken.
DMGregory

Ich verstehe den Übersetzungsteil, habe aber nicht verstanden, wie das Hinzufügen einer vierten Koordinate hilft oder ein Trick zum Teilen durch z ist

Für das, was es wert ist, können Sie das tun, was Sie gesagt haben. Das Teilen von x und y durch z ist eine gültige Methode zum Konvertieren von 3D-Koordinaten in einen 2D-Bildschirmbereich mit Projektion, bei der entfernte Objekte kleiner werden. Das w ist eine homogene Koordinate, um es in die vierte Dimension zu bringen, um translatorisch arbeiten zu können.
Alan Wolfe

Antworten:


14

Denn wenn man nur teilen , [x, y, z]indem zSie erhalten [x/z, y/z, 1]und verloren Sie den tatsächlichen Wert z, 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 zzumindest 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:

| 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   |

Nach der perspektivischen Teilung wird der Vektor:

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

Und das c + d/zTeil liefert uns genug Informationen, um den Z-Puffer zu füllen.


Sie könnten nur das X und das Y durch Z teilen, was [x / z, y / z, z] ergibt. Die GPU nicht hat , um Vektor - Abteilung zu tun, könnte es entworfen wurde , eine Berechnung zu tun.
user253751

3

Technisch könnte man das machen. Aber warum sich die Mühe machen? Wenn Sie das Finale zerreicht haben, können Sie entweder:

  • konstruieren Sie eine 3x3-Matrix, wie Sie beschrieben haben, verschwenden Sie 9 * sizeof(float)Bytes an Speicherplatz, verbringen Sie Rechenzyklen 1/z(eine Division) und führen Sie dann neun Multiplikationen und sechs Additionen durch, um Ihren endgültigen Scheitelpunkt zu erhalten, oder
  • Sie können drei Divisionen durchführen, so wie es die moderne Pipeline derzeit tut

Eine 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 wKoordinate) 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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.