Einrichten von Projektions-, Modell- und Ansichtstransformationen für den Vertex-Shader in Eigen

8

Ich habe mich umgesehen und nie gesehen, was genau jede Matrix macht und welche Operationen sie bilden (so nennt die eigentliche Eigenfunktion). Das ist, was ich suche. Oder zumindest eine Beschreibung des Prozesses und ein paar Beispiele mit Eigenfunktionen, um allgemein sehen zu können, wie man es macht! Wie auch immer, hier sind einige Details, falls sie nützlich sind:

Ich richte ein Top-Down-Spiel ein (die Kamera ist zwar nach unten fixiert, kann aber entlang der XY-Ebene drehen und bewegen), aber da ich einige 3D-Elemente habe (zusammen mit einigen Dingen, die streng 2D sind) ) Ich denke, eine perspektivische Projektion würde gut funktionieren. Aber ich frage mich, welche Befehle notwendig wären, um eine orthographische Projektion zu erstellen ...

Ich verstehe die Ansicht, indem man die Kamerakoordinaten in den Ursprung übersetzt, durch Kameradrehung dreht, sie zurücksetzt, wo sie sind, und dann für den Zoom skalieren? Aber genau welche Funktionen und Objekte beteiligt wären, bin ich mir nicht sicher.

Und um die Drehung eines gegebenen Objekts zu speichern, scheint eine Quaternion die beste Wahl zu sein. Würde das die Modellprojektion bestimmen? Wenn es mir gelingt, meine Drehung in den 2D-Fall eines Winkels zu vereinfachen, wären Quaternionen dann verschwenderisch?

Und müssen diese Matrizen alle aus der Identität jedes Frames neu generiert werden? Oder können sie irgendwie geändert werden, um den neuen Daten zu passen?

Ich würde wirklich lieber eigen anstelle einer handhaltenden Bibliothek dafür verwenden, aber ich brauche etwas, mit dem ich arbeiten kann, um genau herauszufinden, was vor sich geht ... Ich habe alle GLSL-Einstellungen und die uniformen Matrizen gespeist in das Rendering mit meinen VAOs muss ich nur verstehen und sie machen.

bearbeiten:
Mein Vertex-Shader verwendet dieses Standard-Setup, bei dem 3 uniforme Mat4s mit einer Position vec3 multipliziert werden:

%Vor%

Können mat3s und ein vec2 für Position verwendet werden, um in rein 2D-Fällen eine bessere Leistung zu erzielen?

    
user173342 07.12.2012, 17:53
quelle

2 Antworten

11

Hier sehen Sie ein Beispiel für eine lookAt- und setPerspective-Funktion zum Erstellen der Ansichts- und Projektionsmatrizen aus einfachen Eingaben:

%Vor%

Sie können dann die Matrizen für GL angeben:

%Vor%

Für die Modellumwandlung (es ist besser, die Ansicht und das Modell getrennt zu halten) können Sie das Geometriemodul mit den Skalierungs-, Übersetzungs- und Quaternion-Klassen verwenden, um ein Affine3f-Objekt zu erstellen.

    
ggael 09.12.2012, 09:26
quelle
0

Shaders wird für jeden Vertex ausgeführt, der an die Rendering-Pipeline geliefert wird. Um die beste Leistung zu erzielen, führen Sie normalerweise die "einheitlichen" Operationen auf der CPU aus, übergeben die ausgearbeiteten Informationen mit Uniformen an jede Shader-Instanz und führen dann ...

aus

In dem von Ihnen bereitgestellten Beispiel ist es besser, nur mat4 * vec4 anstelle von mat4 * mat4 * mat4 * vec4 zu berechnen, tatsächlich:

  

gl_Position = modelviewprojectionMatrix * vec4 (in_Position, 1.0);

Dabei ist modelviewprojectionMatrix das Ergebnis von projectionMatrix * viewMatrix * modelMatrix . Die Matrixarithmetik wird auf der CPU-Seite für jede Gruppe von Vertices implementiert, die Sie rendern müssen.

Wie organisieren Sie die Daten, die Sie benötigen, um die Modellansichts-Projektionsmatrizen abzuleiten, die Ihren Anforderungen entsprechen? Die tatsächliche Leistung hängt von dem zu rendernden Szenegraph ab; Wenn Sie beispielsweise nur Übersetzungen ausführen (möglicherweise nur auf der XY-Ebene), sind nur Vektorübersetzungen möglich, die Matrizen erzeugen, wenn sie benötigt werden.

Matrizen werden mit Standard algebraischen Operationen multipliziert. Matrizen können Modellmatrizen oder Projektionsmatrizen sein. Transformationen können durch Multiplikation zweier Transformationsmatrizen verkettet werden.

    
Luca 07.12.2012 19:51
quelle

Tags und Links