Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

XoR

Frischling

  • »XoR« ist der Autor dieses Themas
  • Private Nachricht senden

1

16.11.2014, 00:28

[DX11] Fragen zu Orthographic matrix

Guten Abend!

Ich hätte ein paar Verständnisfragen zur Orthographic matrix in DirectX 11.

Ich dachte eine Orthographic matrix wäre einfach eine projection matrix, nur ohne die Darstellung von Tiefe. Als ich sprites gerendert habe mit einer Orthographic matrix und meine view matrix als Identity-matrix hatte, wurde alles wunderbar dargestellt. als ich jedoch eine view matrix erstellt habe und die Position der "Kamera" verändert habe, wurden irgendwann meine sprites abgeschnitten.
1.Brauche ich also wenn ich eine Orthographic matrix verwende überhaupt eine view matrix?

2.Eine weitere Frage wäre, was für Werte ich denn bei der Erstellung der Orthographic matrix übergebe?: XMMatrixOthographicOffCenterLH
Bei den Tutorials werden für die Breite und Höhe immer die Bildschirm- bzw. Fenstergröße verwendet. Das würde aber doch eigentlich bedeuten, dass einer mit einem größeren Bildschirm mehr von der Szene sehen würde, als einer mit einem kleineren Bildschirm. Das wäre bei einem Sidescroller doch absolut Ungerecht?

3.Wiso eigentlich XMMatrixTranspose ?
Nachdem die Worldmatrix mit der ViewProjectionmatrix multipliziert wurde, wird die resultierende Matrix transponiert. Warum?
Ich weiß was transponieren theoretisch macht, dass im Prinzip Reihen und Spalten vertauscht werden, aber was macht es konkret? Eine Drehung des Raumes?


Wäre super wenn mir einer diese Fragen beantworten könnte. Ich habe lange versucht es allein zu lösen, brauche aber nun doch eure Hilfe.

Grüße, xor :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

16.11.2014, 09:01

1.Brauche ich also wenn ich eine Orthographic matrix verwende überhaupt eine view matrix?
Das hängt wohl von der Art Spiel ab. Ein Tetris braucht keine, ein Side-Scroller hingegen schon. Du willst bei letzterem ja nicht die Welt-Sprites manuell verschieben müssen, sondern den View.
Das wäre bei einem Sidescroller doch absolut Ungerecht?
Womöglich. Aber niemand hat gesagt, dass eine solche Matrix Rücksicht auf Deinen Spieltyp nimmt. Wenn für Dich eine Änderung des Spielfelds ein No-Go ist, solltest Du andere Größen verwenden. Bedenke, dass dabei allerdings Artefakte (Texture-Bleeding) in den Sprites entstehen können, weil deren Pixel interpoliert werden müssen bei der Skalierung. Bedenke ebenfalls, dass nicht alle Bildschirme dasselbe Seitenverhältnis besitzen, Du Dir also etwas überlegen musst, damit nicht ein Spieler mit 16:9 oben und unten weniger sieht als ein anderer mit 4:3. Wahlweise links und rechts.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

LukasBanana

Alter Hase

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

16.11.2014, 12:29

1.) brauchen ist da relativ, aber eigentlich sollte es nicht schaden, eine View Matrix zu haben. Die Tatsache, dass hier etwas abgeschnitten wird, hängt damit zusammen, dass du trotz der orthogonalen Projektion immer noch einen Tiefenwert hast.
D.h. deine Koordinaten werden nach wie vor in den Clip-Space transformiert und darin werden die Primitiven (Dreiecke, Linien, Punkte) nach wie vor abgeschnitten (auch anhand der Z Werte).
Deine Objekte können also immer noch 'hinter die Kamera' fallen, auch wenn du das wegen der orthogonalen Projektion nicht erkennen kannst.

Ich hatte in meiner Engine mal Probleme mit den Projektionsmatrizen zwischen GL und D3D gehabt,
und aus irgend einem Grund wurden alle Primitive bei meiner orthogonal Projektion im GL Render System niemals an der Near Plane abgeschnitten.
Also wohl genau das, was du gerade brauchst. Das kann also irgendwie durch modfikationen an der Projektions und View Matrix umgangen werden,
aber ich weiß nicht mehr, wie ich das hinbekommen hatte.

2.) Mag sein, dass in den Beispielen die Bildschirm Breite und Höhe genommen wird, aber ich verwende dazu immer eine separate "Orthogonal Size",
die allerdings das selbe Seitenverhältnis hat, wie die Bildschirmauflösung. Ansonsten ist das aber immer die selbe Größe.
Schließlich werden die Koordinaten vom Hardware Rasterizer noch mit der Viewport-Transformation angepasst.
Die Bildschirmauflösung sollte also nicht schon vorher mit einbezogen werden, sonst hat man das von dir erwähnte Problem, dass der Eine mehr sieht als der Andere.

3.) Ob du deine Matrizen transponiert an einen Shader übergibst oder nicht hängt wohl davon ab, wie du sie im Shader mit der Funktion "mul" verwendest (mul(matrix, vector) oder mul(vector, matrix)),
und/oder wie die Matrizen bei dir von der Host Anwendung (C++ Programm) gespeichert sind (row major oder column major).

Gruß,
Lukas

XoR

Frischling

  • »XoR« ist der Autor dieses Themas
  • Private Nachricht senden

4

17.11.2014, 14:56

Danke für die Antworten!

1:
Ich habe meinen Fehler gefunden. Ich hatte nur die Position der Kamera verändert, nicht aber den Punkt auf den sie schaut. Somit blickte man natürlich schräg auf die Sprites und wurden dann irgendwann abgeschnitten, da sie mit der Nearplane kollidieren. Danke an LukasBanana für den Hinweis!

2:
Soweit eigentlich auch klar, danke an euch beide!
Wobei - eine kleine Frage wäre da noch, auch wenn sie für euch vielleicht einfach erscheint: Die Auflösung ist doch eigentlich nur die Größe des Back- bzw. Frontbuffers? Wie sollte ich bzw. sollte ich eigentlich nicht die Bildschirmauflösung mit einbeziehen? Hat doch eigentlich nichts mit der Orthographic matrix zu tun, oder habe ich da etwas falsch verstanden?

3:
Wenn ich also meine Vektoren und Matrizen anders multiplizeren würde, bräuchte ich die resultieren Matrizen gar nicht Transponieren? Dennoch würde mich interessieren was das Transponieren direkt bewirkt? Dreht es den Raum bzw. das Koordinatensystem?

Aber soweit das Wichtigste beantwortet, danke an euch! :)

Grüße, xor

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

5

17.11.2014, 15:12

zu 3


(Link)


http://de.wikipedia.org/wiki/Matrix_(Mathematik)

LukasBanana

Alter Hase

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

6

17.11.2014, 15:12

Die Projektionsmatrix hat mit einer Pixelauflösung nichts zu tun.
Darum kümmert sich der Hardware Rasterizer wenn die Koordinaten vom Clipping Space (das ist der Koordinatenraum unmittelbar nach der Projektion) in den Screen Space transformiert werden.
Das lässt sich z.B. in OpenGL mit glViewport und in Direct3D 11 mit RSSetViewports einstellen.

SlinDev

Treue Seele

Beiträge: 142

Wohnort: Lübeck

Beruf: Programmierer

  • Private Nachricht senden

7

17.11.2014, 15:25

2: Du musst die Bildschirmauflösung nicht mit einbeziehen, wenn du aber zum Beispiel pixelgenau 2D Grafiken darstellen möchtest, dann hilft es das zu tun.
3: Man kann Matrizen so speichern, dass erst die erste Zeile kommt, dann die zweite usw. Alternativ kann man auch erst alle Werte der ersten Spalte speichern und dann die nachfolgenden Spalten anhängen. Wenn man mit den Matrizen rechnen will, muss man das natürlich beachten. Wenn du jetzt aus irgendeinem Grund deine Matrizen im anderen Format hast als das mit dem DX rechnet, müssen die Matrizen zunächst transponiert werden um das zu korrigieren. Dadurch, dass die Matrixmultiplikation jeweils die Zeilen der ersten Matrix mit den Spalten der zweiten multipliziert, hat ein umdrehen der Faktoren den gleichen Effekt, als würde man beide Transponieren.
Die Auswirkung des transponierens auf das Koordinatensystem kann ich mir nicht weiter hilfreich vorstellen.

XoR

Frischling

  • »XoR« ist der Autor dieses Themas
  • Private Nachricht senden

8

17.11.2014, 15:35

Super! Danke für die schnellen und verständlichen Antworten. Alle Fragen restlos geklärt. :)

Werbeanzeige