Все это хорошие ответы, но есть и другой способ: (не всегда ли?)
В связи с растущей популярностью виртуальной реальности, сотрудники OculusVR разработали трио расширений «Multiview», которые называются:
- OVR_multiview ,
- OVR_multiview2 , &
- OVR_multiview_multisampled_render_to_texture
Эти расширения позволяют визуализировать несколько видов одной и той же сцены в одном вызове отрисовки, устраняя избыточность рендеринга одной и той же сцены в одном и том же состоянии с точки зрения каждого глаза. Хотя созданный для целей VR, разработчик не обязательно ограничен просто двумя представлениями. Скорее, это расширение позволяет использовать столько представлений, сколько указано в MAX_VIEWS_OVR .
Перед использованием этих расширений разработчик должен проверить их поддержку в графическом драйвере пользователя, добавив следующий код:
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 );
}
Оттуда, это вопрос настройки вашего кадрового буфера для использования этой функции:
glFramebufferTextureMultisampledMultiviewOVR = PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEDMULTIVIEWOVR(eglGetProcAddress("glFramebufferTextureMultisampleMultiviewOVR"));
glFramebufferTextureMultisampledMultiviewOVR (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureID, 0, 0, 2);
и аналогично в шейдере:
#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);
}
В приложении с привязкой к ЦП это расширение может значительно сократить время рендеринга, особенно в более сложных сценах :