多视口OpenGL ES

问题描述:

我目前正试图制作一个使用多个opengl视口(即分屏)的ios应用程序。下面是我如何做它:多视口OpenGL ES

// Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer 
    glGenFramebuffersOES(1, &defaultFramebuffer); 
    glGenRenderbuffersOES(1, &colorRenderbuffer); 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); 
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer); 

// Replace the implementation of this method to do your own custom drawing 
const GLfloat squareVertices[] = { 
    -0.5f, -0.5f, 
    0.5f, -0.5f, 
    -0.5f, 0.5f, 
    0.5f, 0.5f, 
}; 
const GLubyte squareColors[] = { 
    255, 255, 0, 255, 
    0, 255, 255, 255, 
    0,  0, 0, 0, 
    255, 0, 255, 255, 
}; 

[EAGLContext setCurrentContext:context]; 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer); 
glViewport(0, backingHeight/2, backingWidth/2, backingHeight/2); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f); 
glMatrixMode(GL_MODELVIEW); 
glRotatef(3.0f, 0.0f, 0.0f, 1.0f); 

glClearColor(0.5f, 0.5f, 0.5f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 

glVertexPointer(2, GL_FLOAT, 0, squareVertices); 
glEnableClientState(GL_VERTEX_ARRAY); 
glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors); 
glEnableClientState(GL_COLOR_ARRAY); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); 
// equivalent to glutswapBuffers() 
[context presentRenderbuffer:GL_RENDERBUFFER_OES]; 

/*********************SECOND VIEW*******/ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer); 
glViewport(backingWidth/2, 0, backingWidth/2, backingHeight/2); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f); 
glMatrixMode(GL_MODELVIEW); 
glRotatef(3.0f, 0.0f, 0.0f, 1.0f); 

glClearColor(0.5f, 0.5f, 0.5f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 

glVertexPointer(2, GL_FLOAT, 0, squareVertices); 
glEnableClientState(GL_VERTEX_ARRAY); 
glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors); 
glEnableClientState(GL_COLOR_ARRAY); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); 
[context presentRenderbuffer:GL_RENDERBUFFER_OES]; 
/*********************END***************/ 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 
  1. 在模拟器上,只出现第二视窗(在这种情况下,在屏幕的右下角有一个旋转的立方体)。而在设备上,他们都出现,但闪烁...(左上角和底部riht)
  2. glRotatef获取应用两次,但我只想或任何其他转换应用一次。

我想要的只是显示相同的场景两次。基本上我试图模拟有两台摄像机在观看相同的东西,并将其显示在屏幕上。很明显,我做错了什么,有2个独立的帧缓冲区和渲染缓冲区会更好还是有更简单的方法来实现?

+0

你是否做了glGetError检查? – Tim 2012-07-05 21:51:18

的问题是这一行:

/*********************SECOND VIEW*******/ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_FRAMEBUFFER); 

glClear不受视口,你需要的,如果你想清楚的部分为使用剪刀测试或模板缓冲区。

请参阅glClear的文档。

+0

评论说线路不会改变什么,相同的效果 – PPR 2012-07-06 17:11:30