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:
- OVR_multiview ,
- OVR_multiview2 , &
- OVR_multiview_multisampled_render_to_texture
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:
const GLubyte* extensions = GL_CHECK( glGetString( GL_EXTENSIONS ) );
char * found_extension = strstr( (const char*)extensions, "GL_OVR_multiview" );
if (NULL == found_extension)
{
exit( EXIT_FAILURE );
}
Von dort aus müssen Sie Ihren Framebuffer einrichten, um diese Funktion nutzen zu können:
glFramebufferTextureMultisampledMultiviewOVR = PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEDMULTIVIEWOVR(eglGetProcAddress("glFramebufferTextureMultisampleMultiviewOVR"));
glFramebufferTextureMultisampledMultiviewOVR (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureID, 0, 0, 2);
und ebenfalls im Shader:
#version 300 es
#extension GL_OVR_multiview : enable
layout(num_views = 2) in;
in vec3 vertexPosition;
uniform mat4 MVP[2];
void main(){
gl_Position = MVP[gl_ViewID_OVR] * vec4(vertexPosition, 1.0f);
}
In einer CPU-gebundenen Anwendung kann diese Erweiterung die Renderzeit erheblich verkürzen, insbesondere bei komplexeren Szenen :