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

Tobiking

1x Rätselkönig

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

1

17.02.2010, 19:45

Reihenfolge Matrixmultiplikation in GLSL

Ich schreibe zurzeit ein paar Matrix Funktionen, mit denen ich unter anderem die View- und Projektionsmatrix einer Kamera erzeugen will. Beim Verwenden dieser in GLSL ist mir allerdings aufgefallen das dort (in den Tutorials die ich mir angeguckt habe) nicht Vertex * ViewProjection gerechnet wird, sondern ViewProjection * Vertex.

Der Versuch das im Shdader umzudrehen war erfolglos. Wenn ich allerdings die Reihenfolge umdrehe, in denen ich die Matrizen multipliziere, scheint es zu klappen. Das heißt ich rechne ViewProjection = Projection * View.

Was ich mich nun frage ist, ob das so richtig ist, oder ob ich da irgendwo einen Dreher drin habe. Es kommt mir irgendwie komisch vor.

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

2

17.02.2010, 21:38

Re: Reihenfolge Matrixmultiplikation in GLSL

Zitat von »"Tobiking"«

zu klappen. Das heißt ich rechne ViewProjection = Projection * View.


ich weiss es nicht genau, aber es könnte dran liegen, wie die matrizen gespeichert werden. row-major in d3d, column-major in ogl.
als beispiel:
V = Sichtmatrix, P = Projectionsmatrix,
R = Sicht/Projektionsmatrix ( V komponiert mit P )
in d3d: R = VP
in ogl: R = (VP)^t = P^t * V^t, mit M^t = transponierte von M
"Don't trust your eyes: They are a hell of a lot smarter than you are"

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

3

17.02.2010, 21:57

So sieht's in meinem Shader aus:

Quellcode

1
2
3
4
5
    #if REFLECTION==1 || REFRACTION==1
        #define ATransformVertexMVP() gl_ProjectionMatrix*ummCameraMat*gl_ModelViewMatrix*gl_Vertex;
    #else
        #define ATransformVertexMVP() ftransform()
    #endif


In dem Fall sinds drei Matrizen.
Wenn du eine draus machen wolltest, wäre es also im Fall von Projection und Modelview dann MVP = gl_ProjectionMatrix * gl_ModelViewMatrix.
In dem Code-Schnipsel habe ich... da es vom Handling her einfacher war... die Kamera-Matrix auch nochmal seperat geliefert, falls Refraction an ist, dann ist es also Projection * Camera * Object.

LG
Alyx

Tobiking

1x Rätselkönig

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

4

17.02.2010, 22:16

Ah, das mit dem column-major war der richtige Ansatz. Wenn ich bei glUniformMatrix4fv angebe das die Matrix transponiert ist geht das im Shader auch umgedreht.

Mir ist dann auch aufgefallen das ich in meiner Matrixmultiplikation Zeilen und Spalten verwechselt habe. Jetzt sieht es ordentlich aus.

Danke für die Hilfe.

Werbeanzeige