0

我使用 openGL ES 1.0。解码流数据后,变为RGBA位。然后我将 RGBA 字节传输到带有参数的“渲染器”方法。
渲染器方法由每个帧例程调用。因为 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];
 }
4

2 回答 2

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.");

另外,尝试加载两个正方形纹理的幂,看看是否有效。

于 2013-08-02T18:25:24.070 回答
0

哦,我刚刚解决了。

我在 glTexImage2D 函数下方添加了这一行。(不好意思,我是openGL的初学者,好像是做一个带纹理的链接frameBuffer。)

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

我使用 iPhone5(armv7s)。对 1280x1024 30fps 图片进行解码和调整大小就足够了。但渲染需要从使用 CPU 改为使用 GPU。所以,现在我可以做出更好的表现。(23fps -> 30fps)

谢谢。

于 2013-08-05T05:26:27.800 回答