2013-08-02 116 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)

谢谢。