2011-05-04 77 views
2

Hy伙计,iPhone的opengl ES复制framebuffer到渲染缓冲区

我正在研究opengl es中的动画。动画应该画正方形。这已经可以工作了,但是我怎样才能将Framebuffer中的内容复制到渲染缓冲区中,问题是每个帧只有一个方块在显示器上。

当我在模拟器中测试它,它工作。随着每一个新的框架,一个知道正方形被画出来,其他已经画出来的仍然在屏幕上。但是,当我在设备上测试它时,它不起作用。屏幕只是闪烁。

我认为这是因为我的Mac像其他电脑一样使用doublebuffering和iPhone dosen't。

请帮帮我。

这是我怎么设置我的帧缓冲区:

- (BOOL)createFramebuffer { 

    glGenFramebuffersOES(1, &viewFramebuffer); 
    glGenRenderbuffersOES(1, &viewRenderbuffer); 

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]; 
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); 

    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); 
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); 
    if (USE_DEPTH_BUFFER) { 
      glGenRenderbuffersOES(1, &depthRenderbuffer); 
      glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); 
      glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); 
      glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); 
     } 

     if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) { 
      NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)); 
      return NO; 
     } 

     return YES; 
    } 

我也写了setupView函数了Methode:

- (void)setupView { 
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    // Black Background 
    // glEnable(GL_DEPTH_TEST);       // Enables Depth Testing 
    // glDepthFunc(GL_LEQUAL);        // The Type Of Depth Testing To Do 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations 


    glViewport(0,0,backingWidth,backingHeight);      // Reset The Current Viewport 

    glMatrixMode(GL_PROJECTION);      // Select The Projection Matrix 
    glLoadIdentity();         // Reset The Projection Matrix 

    // Calculate The Aspect Ratio Of The Window 
    gluPerspective(45.0f,(GLfloat)backingWidth/(GLfloat)backingHeight,0.1f,100.0f); 

    glMatrixMode(GL_MODELVIEW);       // Select The Modelview Matrix 

    isSetUp = YES; 

} 

这是我的drawView函数了Methode:

常量GLfloat squareVertices [ ] = { -1.0f,1.0f,0.0f, 1.0f,1.0f,0.0f, 1.0f,-1.0f,0.0f, -1.0f,-1.0f,0.0f };

[EAGLContext setCurrentContext:context]; 

if (!isSetUp) { 
    [self setupView]; 
} 


glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 

//glClear(GL_COLOR_BUFFER_BIT); 

//////////////////////Variablen 
float xg = -26; 
float yg = 35.5; 
float z = -100.0; 

float abstandXg = 3.0; 
float abstandYg = 3.0; 

for (int i = 0; i < 26; i++) { 
    //arrayKoordinatenY[j] = y - abstandY * (j); 
    for (int j = 0; j<=17; j++) { 

     // glLoadIdentity(); 
     //arrayKoordinatenX[i] = x + abstandX * (i); 
     //glTranslatef(arrayKoordinatenX[j],arrayKoordinatenY[i],z); 

     glTranslatef(xg,yg,z); 


     glEnableClientState(GL_VERTEX_ARRAY); 


     glColor4f(0.0f,0.0f,0.0f,0.0f); 
     glVertexPointer(3, GL_FLOAT, 0, squareVertices); 
     glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 

     arrayKoordinatenX[j]=xg; 
     xg = xg + abstandXg;   

    } 
    xg = -26.0; 

    arrayKoordinatenY[i]=yg; 
    yg = yg - abstandYg; 
} 
//// Here comes the Part where the squares are draw 
. 
. 
. 
///// 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
    [context presentRenderbuffer:GL_RENDERBUFFER_OES]; 
} 
+0

发布您的渲染代码 – Max 2011-05-04 18:04:11

+0

你的意思是drawView Methode? – 2011-05-04 18:06:09

+0

很可能是=) – Max 2011-05-04 18:06:38

回答

0
glMatrixMode(GL_PROJECTION);      // Select The Projection Matrix 
glLoadIdentity(); 

OK - 但如果是GL_MODELVIEW同样的事情?

+0

在setupView方法或你的意思是别的吗? – 2011-05-04 18:25:26

+0

每次渲染帧(对于模型和投影矩阵),您都必须加载标识。 – Max 2011-05-04 18:28:54

+0

所以你的意思是我应该这样写呢? 'glMatrixMode(GL_PROJECTION); glMatrixMode(GL_MODELVIEW); glLoadIdentity();' – 2011-05-04 18:30:31