2013-08-02 155 views
0

我使用openGL ES 1.0。在解碼流數據後,它被改爲RGBA位。然後我使用參數將RGBA字節傳輸到「渲染器」方法。
渲染器方法由每個框架例程調用。因爲RGBA字節每次都改變。iOS openGL ES 1.0,渲染失敗Texture2D

但它沒有畫任何相框。只顯示白色矩形和背景灰色。問題是什麼?

[初始化]

- (id <ESRenderer>) init 
{ 
    if (self = [super init]) 
    { 
     context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; 
     if (!context || ![EAGLContext setCurrentContext:context]) 
     { 
      [self release]; 
      return nil; 
     } 

     // 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); 

     glEnable(GL_TEXTURE_2D); 
     glGenTextures(1, &frameTexture); 
     glBindTexture(GL_TEXTURE_2D, frameTexture); 

     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

     glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, frameTexture, 0); 
     glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer); 
    } 
    return self; 
} 

[渲染方法。它被外部每幀調用]

static const GLfloat verticesForGL_TRIANGLE_STRIP[] = { 
    -0.8, 0.8, 0.0,   //v1 
    0.0, 1.0,    //UV1 

    -0.8, -0.8, 0.0,   //v2 
    0.0, 0.0,    //UV2 

    0.8, 0.8, 0.0,   //v3 
    1.0, 1.0,    //UV3 

    0.8, -0.8, 0.0,   //v4 
    1.0, 0.0,    //UV4 
}; 

- (void)render:(uint8_t*)data 
{ 
    if ([EAGLContext currentContext] != context) 
     [EAGLContext setCurrentContext:context]; 

    glClearColor(0.4f, 0.4f, 0.4f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glViewport(0, 0, backingWidth, backingHeight); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    glOrthof(-1.1f, 1.1f, -1.1f, 1.1f, -2.0f, 2.0f); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1280, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 

    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, frameTexture); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glVertexPointer(3, GL_FLOAT, sizeof(GLfloat)*5, verticesForGL_TRIANGLE_STRIP); 
    glTexCoordPointer(2, GL_FLOAT, sizeof(GLfloat)*5, &verticesForGL_TRIANGLE_STRIP[0]+3); 

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

    glDisable(GL_TEXTURE_2D); 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

    [context presentRenderbuffer:GL_RENDERBUFFER_OES]; 
} 

回答

0

對我來說,你似乎試圖加載一個非冪次級紋理。這在openGl es 1.0/1.1上的所有iOS設備上都不受支持。您可以檢查設備支持這種擴展

bool npot = strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0; 
if (! npot) 
    NSLog("Non power of two textures not supported."); 

此外,嘗試加載兩個方形紋理的功率,看看是否可行。

+0

我使用armv7和armv7s。 – user2645151

0

哦,我剛剛解決了。

我在glTexImage2D函數下面添加了這一行。 (對不起,我是一個關於openGL的新手,它似乎使紋理鏈接幀緩存。)

glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES, GL_TEXTURE_2D, frameTexture, 0); 

我使用的iPhone5(armv7s)。這足以解碼和調整1280x1024 30fps圖片的大小。但渲染需要從使用CPU到GPU。 所以,現在我可以做出更好的表現。 (23fps - > 30fps)

謝謝。