iOS openGL ES 1.0,无法渲染Texture2D



我使用openGL ES 1.0。在解码流数据之后,它被改变为RGBA比特。然后我用参数将RGBA字节传输到"renderer"方法
renderer方法由每个帧例程调用。因为RGBA字节每次都会更改。

但它不画任何画框。只显示白色矩形和背景灰色。问题出在哪里?

[初始化]

- (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];
 }

在我看来,你试图加载一个非二次方的纹理。并非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.");

此外,尝试加载二次方纹理,看看是否有效。

哦,我刚才已经解决了。

我在glTexImage2D函数下面添加了这一行。(对不起,我是openGL的初学者。它似乎可以制作一个带有纹理的链接帧缓冲区。)

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

我用的是iPhone5(armv7)。这足以解码1280x1024张每秒30帧的图片并调整其大小。但是渲染需要从使用CPU改变为使用GPU。所以,现在我可以做出更好的表现。(23帧/秒->30帧/秒)

谢谢。

相关内容

  • 没有找到相关文章

最新更新