Warum war Direct3D left-handed

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8355
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Warum war Direct3D left-handed

Beitrag von Krishty »

Hi,

Früheren Versionen von D3D (vor 9) sagt man nach, sie seien linkshändig. Was genau war an der API so linkshändig, dass man es nicht durch Negieren einer Achse ausgleichen konnte?

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Warum war Direct3D left-handed

Beitrag von eXile »

Meiner Meinung nach garnichts. Du musst halt einfach deine Transformationsmatrizen richtig setzen, dann kommt auch das richtige raus. Da geschieht ja keine Magie, sondern eigentlich ist Direct3D in der Hinsicht ja nur eine schnelle Matrizenmultiplikationsmaschine. Das einzige, was ich mir im entferntesten vorstellen könnte, ist so etwas wie clockwise/counter-clockwise face culling.

(Dass Direct3D und HLSL noch immer mit Reihenvektoren und Matrizenmultiplikation von Rechts arbeitet (damit die Translation in der letzten Zeile steht, so wie es die Götter vorgegeben haben!), sollte wohlbekannt sein. Und dass das Memory-Layout zwischen Direct3D 11 und HLSL geflippt ist (darum beim Übergeben von Matrizen immer schön transponieren).

Der einzige Unterschied zwischen den *LH und *RH-Funktionen ist Behandlung der Eingabedaten. Beispielsweise gibt es D3DXMatrixPerspectiveOffCenterLH/-RH. Die Dokumentation sagt dazu „Builds a customized, left-/right-handed perspective projection matrix.“. Das ist genau betrachtet eine Lüge.

Formal ist D3DXMatrixPerspectiveOffCenterLH eine Funktion vom Vektorraum V_LH → V_LH, wohingegen D3DXMatrixPerspectiveOffCenterRH eine Funktion vom Vektorraum V_RH → V_LH ist. Damit ist zu sagen, eine Matrix sei links- oder rechtshändisch grober Unfug. Das sind Funktionen; und Funktionen sind erst definiert durch Angabe von Quell- und Zielraum und der Abbildungsvorschrift. Wenn man irgendetwas davon weglässt, ist das Blödsinn und bei genauem Nachdenken kann man die Funktion nicht mehr verwenden.

Es gibt also kein Merkmal der Links- oder Rechtshändigkeit von Matrizen. Die -RH-Variante macht eigentlich folgendes: 1. Flip der dritten Komponente des eingegebenen Vektors. 2. Normale Projektion berechnen. D.h. es gibt keine „linkshändische Projektionsmatrix“ oder „rechtshändische Projektionsmatrix“. Die Projektionsmatrizen sind gleich; sie arbeiten nur auf unterschiedlichen Eingabedaten. Oder mathematisch: Auf Vektoren aus unterschiedlichen Vektorräumen.

Das Problem sind einfach die Eingabedaten.)
Zuletzt geändert von eXile am 12.11.2011, 21:10, insgesamt 1-mal geändert.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Warum war Direct3D left-handed

Beitrag von CodingCat »

eXile hat geschrieben:(Dass Direct3D und HLSL noch immer mit Reihenvektoren und Matrizenmultiplikation von Rechts arbeitet (damit die Translation in der letzten Zeile steht, so wie es die Götter vorgegeben haben!), sollte wohlbekannt sein. Und dass das Memory-Layout zwischen Direct3D 11 und HLSL geflippt ist (darum beim Übergeben von Matrizen immer schön transponieren).)
Man kann das eigentlich schon immer machen wie man will mittels D3DXSHADER_PACKMATRIX_COLUMNMAJOR/D3DXSHADER_PACKMATRIX_ROWMAJOR in D3D9 und D3D_SHADER_PACK_MATRIX_ROW_MAJOR/D3D_SHADER_PACK_MATRIX_COLUMN_MAJOR sonst, dann brauchst du auch keine Transponierung. Das geht per HLSL-Keyword sogar für jede Matrix einzeln im Shader-Code. Und wenn dir die Multiplikationsreihenfolge/das Matrix-Layout nicht passt, nimmst du halt mul(mat, vec) statt mul(vec, mat) im HLSL-Code. ;)
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Warum war Direct3D left-handed

Beitrag von eXile »

CodingCat hat geschrieben:D3DXSHADER_PACKMATRIX_COLUMNMAJOR/D3DXSHADER_PACKMATRIX_ROWMAJOR in D3D9 und D3D_SHADER_PACK_MATRIX_ROW_MAJOR/D3D_SHADER_PACK_MATRIX_COLUMN_MAJOR sonst, dann brauchst du auch keine Transponierung. Das geht per HLSL-Keyword sogar für jede Matrix einzeln im Shader-Code. Und wenn dir die Multiplikationsreihenfolge/das Matrix-Layout nicht passt, nimmst du halt mul(mat, vec) statt mul(vec, mat) im HLSL-Code. ;)
Oha, vielen Dank. Ich als 3D-API-Noob wusste das mit der Packierung beim Shader-Kompilieren nicht. Letzteres mit dem mul war mich klar; ich wollte aber halt nicht noch extra meine Matrix dafür transponieren. Aber OK, wenn das direkt über die Packierung lösbar ist, nehme ich das doch gerne an. ;)
Benutzeravatar
Krishty
Establishment
Beiträge: 8355
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Warum war Direct3D left-handed

Beitrag von Krishty »

Dann ist das also alles nur Schall und Rauch? Okay; dankeschön!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Warum war Direct3D left-handed

Beitrag von dot »

Der Clipspace ist sowohl in D3D als auch in OpenGL linkshändig. In OpenGL hat eben das rechtshändige Weltkoordinatensystem Tradition, in D3D das linkshändige. Ich persönlich find die linkshändige Variante intuitiver. Am Ende isses aber immer nur eine Frage der Matritzen die man verwendet...
Antworten