Ce sont toutes de bonnes réponses, et pourtant il existe une autre manière: (N'est-ce pas toujours le cas?)
En raison de la popularité croissante de la réalité virtuelle, les gens d'OculusVR ont développé un trio d'extensions "Multiview" appelées:
- OVR_multiview ,
- OVR_multiview2 , &
- OVR_multiview_multisampled_render_to_texture
Ces extensions permettent de rendre plusieurs vues de la même scène en un seul appel, ce qui élimine la redondance du rendu de la même scène dans le même état du point de vue de chaque œil. Bien que créé dans le but de VR, le développeur n'est pas nécessairement limité à seulement deux vues. Cette extension permet plutôt autant de vues que MAX_VIEWS_OVR le spécifie.
Avant d'utiliser ces extensions, le développeur doit vérifier leur prise en charge dans le pilote graphique de l'utilisateur en ajoutant le code suivant:
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 );
}
À partir de là, il s'agit de configurer votre framebuffer pour utiliser cette fonctionnalité:
glFramebufferTextureMultisampledMultiviewOVR = PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEDMULTIVIEWOVR(eglGetProcAddress("glFramebufferTextureMultisampleMultiviewOVR"));
glFramebufferTextureMultisampledMultiviewOVR (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureID, 0, 0, 2);
et de même dans le 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);
}
Dans une application liée au processeur, cette extension peut réduire considérablement le temps de rendu, en particulier avec les scènes plus complexes :