Estas son todas buenas respuestas y, sin embargo, hay otra manera: (¿No hay siempre?)
Debido a la creciente popularidad de la realidad virtual, la gente de OculusVR ha desarrollado un trío de extensiones "Multiview" llamadas:
- OVR_multiview ,
- OVR_multiview2 , &
- OVR_multiview_multisampled_render_to_texture
Estas extensiones permiten que se visualicen múltiples vistas de la misma escena en una sola llamada de dibujo, eliminando la redundancia de renderizar la misma escena en el mismo estado desde el punto de vista de cada ojo. Aunque creado con el propósito de VR, el desarrollador no se limita necesariamente a solo dos vistas. Más bien, esta extensión permite tantas vistas como MAX_VIEWS_OVR especifica.
Antes de usar estas extensiones, el desarrollador debe verificar su compatibilidad en el controlador de gráficos del usuario agregando el siguiente código:
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 );
}
A partir de ahí, se trata de configurar su framebuffer para utilizar esta función:
glFramebufferTextureMultisampledMultiviewOVR = PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEDMULTIVIEWOVR(eglGetProcAddress("glFramebufferTextureMultisampleMultiviewOVR"));
glFramebufferTextureMultisampledMultiviewOVR (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureID, 0, 0, 2);
y del mismo modo en el sombreador:
#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);
}
En una aplicación vinculada a la CPU, esta extensión puede reducir drásticamente el tiempo de renderizado, especialmente con escenas más complejas :