Frage

Auf dieser Seite: http://www.toymaker.info/Games/html /vertex_shaders.html

Wir haben den folgenden Code-Schnipsel:

// transformations provided by the app, constant Uniform data
float4x4 matWorldViewProj: WORLDVIEWPROJECTION;

// the format of our vertex data
struct VS_OUTPUT
{
  float4 Pos  : POSITION;
};

// Simple Vertex Shader - carry out transformation
VS_OUTPUT VS(float4 Pos  : POSITION)
{
  VS_OUTPUT Out = (VS_OUTPUT)0;
  Out.Pos = mul(Pos,matWorldViewProj);
  return Out;
}

Meine Frage ist: warum die Struktur VS_OUTPUT einen 4-dimensionalen Vektor wie seine Position hat? Ist das nicht die Position nur x, y und z?

War es hilfreich?

Lösung

Weil Sie benötigen die w für Perspektive Berechnung koordinieren. Nach der Ausgabe von dem Vertex-Shader als DirectX führt eine perspektivische dividieren durch Dividieren durch w.

Im Wesentlichen, wenn Sie 32768, -32768, 32768, 65536 als Ausgabe Eckpunktposition dann nach w teilen Sie 0,5 erhalten, -0,5, 0,5, 1. An diesem Punkt kann die w verworfen werden, da es nicht mehr benötigt wird. Diese Informationen werden dann durch die Darstellungsmatrix geleitet, die es 2D-Koordinaten brauchbaren transformiert.

Edit:. Wenn Sie schauen, wie eine Matrix-Multiplikation wird die Projektionsmatrix unter Verwendung können Sie sehen, wie sich die Werte an den richtigen Stellen platziert bekommen

Unter der Projektionsmatrix in D3DXMatrixPerspectiveLH angegeben

2*zn/w  0       0              0
0       2*zn/h  0              0
0       0       zf/(zf-zn)     1
0       0       zn*zf/(zn-zf)  0

Und es zu einem zufälligen x, y, z Anwendung 1 (für eine Vertexposition Hinweis w immer 1 sein wird) Vertex Eingangswert Sie das folgende

erhalten
x' = ((2*zn/w) * x) + (0 * y) + (0 * z) + (0 * w)
y' = (0 * x) + ((2*zn/h) * y) + (0 * z) + (0 * w)
z' = (0 * x) + (0 * y) + ((zf/(zf-zn)) * z) + ((zn*zf/(zn-zf)) * w)
w' = (0 * x) + (0 * y) + (1 * z) + (0 * w)

sofort können Sie sehen, dass w und z verschieden sind. Die w Koord enthält nun nur die Z an die Projektionsmatrix geleitet zu koordinieren. z enthält etwas viel komplizierter.

So .. nehmen wir eine Eingangsposition haben (2, 1, 5, 1) haben wir eine zn (Z-Nah) von 1 und eine zf (Z-Far von 10) und aw (Breite) von 1 und ah (Höhe) von 1.

diese Werte Wenn Sie durch erhalten wir

x' = (((2 * 1)/1) * 2
y' = (((2 * 1)/1) * 1
z' = ((10/(10-1)  * 5 + ((10 * 1/(1-10)) * 1)
w' = 5

erweitern, dass wir dann bekommen

x' = 4
y' = 2
z' = 4.4
w' = 5

Wir haben dann endgültige Perspektive divide durchführen und wir bekommen

x'' = 0.8
y'' = 0.4
z'' = 0.88
w'' = 1

Und jetzt haben wir unsere endgültige Position koordinieren. Dies setzt voraus, dass x und y im Bereich von -1 bis 1 und z im Bereich von 0 bis 1 reichen, wie Sie den Scheitelpunkt auf dem Bildschirm zu sehen ist.

Als bizarre Bonus kann man sehen, dass, wenn | x '| oder | y '| oder | z '| größer als | w '| oder z‘kleiner als 0 ist, dass der Scheitelpunkt außerhalb des Bildschirms ist. Diese Information wird zum Aufstecken auf das Dreieck auf den Bildschirm verwendet wird.

Auf jeden Fall denke ich, das ist eine ziemlich umfassende Antwort: D

Edit2: Seien Sie gewarnt i ROW großen Matrizen verwende. Spalt große Matrizen werden umgesetzt.

Andere Tipps

Rotation wird durch eine 3-dimensionale Matrix und Übersetzung durch einen Vektor angegeben. Sie können beide Transformationen in einem "single" Operation durchführen, indem sie in einem einzigen 4 x 3 Matrix kombiniert:

rx1 rx2 rx3 tx1
ry1 ry2 ry3 ty1
rz1 rz2 rz3 tz1

Jedoch, da dies nicht quadratisch ist, gibt es verschiedene Operationen, die nicht (Inversion für eine Person) durchgeführt werden können. Durch das Hinzufügen eine zusätzliche Zeile (das tut nichts):

0   0   0   1

All diese Vorgänge werden möglich (wenn nicht sogar leicht).

Wie Goz erklärt in seine Antwort die Matrix den „1“ ein nicht Identitätswert, indem sie wird eine perspektivische Transformation.

Clipping ist ein wichtiger Teil dieses Prozesses, wie es zu visualisieren hilft, was die Geometrie geschieht. Die Abschneidestufe verwirft im Wesentlichen jeden Punkt in einem primitiven, die außerhalb eines 2-Einheitswürfels um den Ursprung zentriert ist (OK, Sie haben Primitiven zu rekonstruieren, die teilweise abgeschnitten werden, aber das spielt hier keine Rolle).

Es wäre möglich, eine Matrix zu konstruieren, die direkt Ihre Weltraumkoordinaten auf einen solchen Würfel abgebildet, sondern schrittweise Bewegung von der weit Ebene zu der nahen Ebene wäre linear. Das heißt, dass ein Wechsel von einem Fuß (auf den Betrachter) als eine Meile entfernt von dem Betrachter die gleiche Zunahme der Größe als Bewegung eines Fußes verursachen würde, wenn mehrere Meter von der Kamera.

Wenn wir jedoch eine andere in unserem Vektor (w) haben koordinieren, können wir den Vektor komponentenweise teilen, indem er w, und unsere Primitive wird das obige Verhalten nicht, aber wir können sie noch innerhalb der 2 am Ende machen -Einheit Würfel oben.

Für weitere Erläuterungen finden Sie unter http://www.opengl.org /resources/faq/technical/depthbuffer.htm#0060 und http: // en .wikipedia.org / wiki / Transformation_matrix # Perspective_projection .

Eine einfache Antwort wäre zu sagen, dass, wenn Sie die Pipeline nicht sagen, was w ist, dann haben Sie es nicht genug Informationen über Ihre Projektion gegeben. Dies kann direkt ohne Verständnis überprüft werden, was die Pipeline daraus macht ...

Wie Sie wahrscheinlich die 4x4-Matrix wissen kann in mehrere Teile aufgeteilt werden, basierend auf, was jeder Teil tut. Die 3x3-Matrix in der oberen linken geändert wird, wenn Sie Rotation oder Skalierung Operationen ausführen. Die vierte Spalte geändert wird, wenn Sie eine Übersetzung zu tun. Wenn Sie jemals eine Perspektive Matrix kontrollieren, verändert sie die untere Reihe der Matrix. Wenn man dann sieht, wie eine Matrix-Vektor-Multiplikation durchgeführt wird, sehen Sie, dass die untere Reihe der Matrix nur die resultierenden w Komponente des Vektors beeinflusst. Wenn Sie also die Pipeline über nicht sagen, w es nicht haben alle Ihre Informationen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top