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

LipkeGu

Frischling

  • »LipkeGu« ist der Autor dieses Themas

Beiträge: 5

Wohnort: Berlin

  • Private Nachricht senden

1

05.12.2020, 16:48

OpenGL: PVM, MVP, VMP, MPV tatütata... Was ist denn nun richtig? :(

Hallo Community,
Ich beschäftige mich seit einer ganzen weile mit der OpenGL 3,x++ und DX11 Programmierung. Versuche in C++ eine Game-Engine "from Scratch" zu erstellen. Doch immer wieder stößt man bei Libaries like GLFW, GLUT, SDL2, OpenTK, SharpDX etc. auf ein Mysterium namens MVP, PVM PMV... (Modelmatrix, ViewMatrix und ProjectionMatrix)

Da ich freeglut, glew, glm und stb nutze, und für aufwendige Tests ein eigenes (Test)-Projekt mit glfw habe, habe ich im test ein punkt mit Lighting.

Ich habe folgendes Entdeckt (Ein Vertex-Shader welchen ich unter GLUT nutze, funktioniert nicht unter GLFW:
GLFW OGL 3.3 nutzt MVP,
GLUT OGL 3.3 nutzt PVM,

In mehreren Büchern wird auch MVP und dann in anderen wiederum PVM benutzt. Warum? Soweit ich verstanden habe ist doch PVM der Standard für OpenGL und MVP für DirectX... :(

Jonathan

Community-Fossil

  • Private Nachricht senden

2

06.12.2020, 10:56

Letztendlich geht es da nur um die Reihenfolge der Matrizenmultiplikation und darum ob Matrizen row-major oder column-major gespeichert werden. Da gibt es leider unterschiedliche Standards und es gibt für keine der Varianten wirklich starke Argumente weswegen es letztendlich jeder gerade so macht, wie er denkt.

Ich persönlich benutze GLM als Mathe-Bibliothek. Das Verhält sich die GLSL-Code so dass Shader und Engine Code quasi gleich aussehen, was sehr nett ist. Die von dir genannten Libraries machen ja eigentlich nichts anderes als die Matrizen an OpenGL weiter zu leiten, also kann man eigentlich ignorieren, welche Konvention sie benutzen.

Noch ein Tip: Durch geschickte Benennung von Variablen kann man leicht erkennen, wenn man etwas falsch transformiert:

C-/C++-Quelltext

1
2
3
4
vec3 position_in_world = world_from_model * position_in_model;
mat4 view_from_model = view_from_world * world_from_model;

mat4 something_wrong = world_from_model * view_from_world; // so nicht!


Das Beispiel oben ist noch simpel, aber spätestens wenn es um Dinge wie Lichtberechnung geht musst du halt sicherstellen, dass alle Vektoren im selben Koordinatensystem sind (und du musst dich entscheiden in welchem Koordinatensystem du die Lichtberechnung durchführen willst), und da hilft so ein Schema wirklich enorm. Wenn man das konsequent durchsetzt kommt man eigentlich niemals in die Verlegenheit nicht zu wissen in welcher Reihenfolge man was anwenden soll, weder im Shader noch in der Engine.
Lieber dumm fragen, als dumm bleiben!