Ich benutze SDL2 .
Derzeit hat mein einziger Shader eine MVP-Matrix und transformiert die Punkte damit.
Ich berechne meine Ansichts- und Projektionsmatrix für eine Kamera mit GLM:
glm::lookAt(pos, pos + forward, up);
glm::perspective(fov, aspectRatio, zNear, zFar);
Ich habe danach gesucht, kann jedoch nur die Legacy-Implementierung mehrerer Ansichtsfenster finden.
Wenn ich zum Beispiel 4 Kameras erstelle und sagen wir, dass sie alle gleich sind , außer dass jede Kamera ein anderes Viertel des Bildschirms zum Rendern hat. (Also ich möchte 4 Ansichtsfenster mit dem gleichen Inhalt)
Wie kann ich das machen? Tut mir leid, wenn ich nicht genug Informationen gegeben habe, zögern Sie nicht zu fragen.
Antworten:
Das Rendern in verschiedene Ansichtsfenster (Teile) desselben Bildschirms kann wie folgt erfolgen:
Teilen Sie beispielsweise den Bildschirm in vier Teile und rendern Sie dieselbe Szene viermal in jeder Ecke mit unterschiedlichen Uniformen und unterschiedlichen Ansichtsfenstern:
quelle
viewport
sind x, y der linken unteren Ecke des Blocks und Breite, Höhe des Blocks. Mit dem Mischen können Sie experimentieren.Wenn Sie Ihren eigenen Vertex / Fragment Shader schreiben, gibt es eine weitere zusätzliche Möglichkeit, dies zu tun. Es ist viel komplizierter, kann aber für Sie und / oder andere nützlich sein. Außerdem wird der gesamte Zeichenvorgang beschleunigt, da nur ein Aufruf eines Zeichenbefehls verwendet wird. Die maximale Anzahl von Ansichtsfenstern wird von GL_MAX_VIEWPORTS definiert und beträgt normalerweise 16.
Seit OpenGL 4.1 existiert die Methode glViewportArrayv . Es kann ein Array von Ansichtsfenstern definieren. Den mit dieser Methode erstellten Ansichtsfenstern ist ein Index zugewiesen.
Dieser Index kann im Vertex Shader verwendet werden, um das Ansichtsfenster festzulegen, in dem die Szene gerendert wird. (Sie müssen die Erweiterung " ARB_shader_viewport_layer_array " in den Shader-Code aufnehmen.)
In Ihrem Fall würde ich Folgendes vorschlagen:
quelle
Dies ist eine Kopie der Antwort von @ narthex, außer nur mit den Ansichtsfenstern, da dies alles ist, was Sie benötigen. Ich bin mir nicht sicher, warum der Frame Buffer / Blend in seiner Antwort enthalten ist.
quelle
Dies sind alles gute Antworten, und doch gibt es einen anderen Weg: (Gibt es nicht immer?)
Aufgrund der wachsenden Beliebtheit der virtuellen Realität haben die Mitarbeiter von OculusVR ein Trio von "Multiview" -Erweiterungen entwickelt, die heißen:
Mit diesen Erweiterungen können mehrere Ansichten derselben Szene in einem einzigen Zeichenaufruf gerendert werden, wodurch die Redundanz beim Rendern derselben Szene im selben Zustand aus Sicht jedes Auges beseitigt wird. Obwohl für VR-Zwecke erstellt, ist der Entwickler nicht unbedingt auf nur zwei Ansichten beschränkt. Diese Erweiterung ermöglicht vielmehr so viele Ansichten, wie MAX_VIEWS_OVR angibt.
Bevor Sie diese Erweiterungen verwenden, sollte der Entwickler den Grafiktreiber des Benutzers auf Unterstützung prüfen, indem er den folgenden Code hinzufügt:
Von dort aus müssen Sie Ihren Framebuffer einrichten, um diese Funktion nutzen zu können:
und ebenfalls im Shader:
In einer CPU-gebundenen Anwendung kann diese Erweiterung die Renderzeit erheblich verkürzen, insbesondere bei komplexeren Szenen :
quelle