2012-07-05 53 views
0

我目前正試圖製作一個使用多個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

回答

2

的問題是這一行:

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

glClear不受視口,你需要的,如果你想清楚的部分爲使用剪刀測試或模板緩衝區。

請參閱glClear的文檔。

+0

評論說線路不會改變什麼,相同的效果 – PPR 2012-07-06 17:11:30