0

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

2 に答える 2

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 に答える
0

2 の累乗でないテクスチャを読み込もうとしているようです。これは、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.");

また、2 乗の正方形のテクスチャをロードしてみて、それが機能するかどうかを確認してください。

于 2013-08-02T18:25:24.070 に答える