To są wszystkie dobre odpowiedzi, a jednak istnieje inny sposób: (czy nie zawsze?)
Ze względu na rosnącą popularność rzeczywistości wirtualnej ludzie z OculusVR opracowali trio rozszerzeń „Multiview” o nazwie:
- OVR_multiview ,
- OVR_multiview2 , i
- OVR_multiview_multisampled_render_to_texture
Rozszerzenia te umożliwiają renderowanie wielu widoków tej samej sceny w jednym wywołaniu losowania, eliminując nadmiarowość renderowania tej samej sceny w tym samym stanie z punktu widzenia każdego oka. Choć stworzony na potrzeby VR, deweloper niekoniecznie ogranicza się do zaledwie dwóch widoków. To rozszerzenie pozwala raczej na wyświetlenie tylu widoków, ile określa MAX_VIEWS_OVR .
Przed użyciem tych rozszerzeń programista powinien sprawdzić ich obsługę w sterowniku graficznym użytkownika, dodając następujący kod:
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 );
}
Następnie należy skonfigurować bufor ramki do korzystania z tej funkcji:
glFramebufferTextureMultisampledMultiviewOVR = PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEDMULTIVIEWOVR(eglGetProcAddress("glFramebufferTextureMultisampleMultiviewOVR"));
glFramebufferTextureMultisampledMultiviewOVR (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureID, 0, 0, 2);
i podobnie w module cieniującym:
#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);
}
W aplikacji związanej z procesorem to rozszerzenie może znacznie skrócić czas renderowania, szczególnie w przypadku bardziej złożonych scen :