这些都是很好的答案,但是还有另一种方法:(不总是存在吗?)
由于虚拟现实的日益普及,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);
}
在受CPU限制的应用程序中,此扩展可以显着减少渲染时间,尤其是对于更复杂的场景: