3

iOS SDK 4.2 へのアップグレード アプリケーションでいくつかの誤動作が発生しています (別の動作についてはこちらで質問されます)。私があなたの助けを求めるつもりのものは、私が入れている 3d モデルをレンダリングしない OpenGL ビュー (EAGLView サブクラス) に関するものです。

ビューが割り当てられ、ジェスチャを認識しているように見えますが、その内容は表示されません(背景に色を付けてモデルを配置するのではなく、ビューに関するものであることを確認しました: 色を付けませんglClearColor())。

ダブルタップすると、サイズが変更されます (フルスクリーンになります。この前は小さな UIVIew です)。このメソッドを呼び出します。

- (void)animateToGrow{
    DNSLog(@"grow");
    grow = YES;
    oldFrame = self.frame;
    oldCenter = self.center;

    [UIView beginAnimations:@"MoveAndStrech" context:nil];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationBeginsFromCurrentState:YES];

    self.frame = CGRectMake(0, 0, WIDTH, HEIGHT); 
    self.center = CGPointMake(CENTER_X, CENTER_Y);
    [UIView commitAnimations];
    [self setupGLPerspectiveNear:0.1 far:1000];
}

すると魔法のようにモデルが現れ、背景まで色がつきます。

サイズを変更して前のフレームと中央の位置に戻すメソッドがあり、呼び出されるとビューが再び「空」になります。

提案の前に?(必要に応じてさらにコードを投稿できます)

更新 これはシミュレーターで発生しています (現時点ではデバイスでテストできません)。これが既知のバグである場合、誰かが Apple ドキュメントから参照していますか?

更新 2 OpenGL ES 2.0 ではなく 1.1 を使用しています。

EAGLView で行うことは次のlayoutSubViewsとおりです。

- (void)layoutSubviews 
{
    [EAGLContext setCurrentContext:_context];
    [self destroyFramebuffer];
    [self createFramebuffer];
    [self drawView];
}

そして、これは私のcreateFramebuffer

- (BOOL)createFramebuffer
{
    glGenFramebuffersOES(1, &_viewFramebuffer);
    glGenRenderbuffersOES(1, &_viewRenderbuffer);
    
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, _viewFramebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, _viewRenderbuffer);
    [_context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, _viewRenderbuffer);
    
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &_backingWidth);
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &_backingHeight);
    
    if (_useDepthBuffer) 
    {
        glGenRenderbuffersOES(1, &_depthRenderbuffer);
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, _depthRenderbuffer);
        glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, _backingWidth, _backingHeight);
        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, _depthRenderbuffer);
    }
    
    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) 
    {
        NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
        return NO;
    }
    
    return YES;
}

更新 3

フルスクリーン フレーム (320x480) を指定してビューを作成すると、正しくレンダリングされたように見えます。何らかの形でビューの寸法に関連しています

4

3 に答える 3

13

これを見つけるのに永遠にかかりました。十分に文書化されていませんが、アップルのドキュメントに記載されています。OS 4.2 以降では、EAGLview のサイズが両方の次元で 32 ピクセルの倍数である必要があります。

于 2010-11-29T20:24:26.057 に答える
2

これはシミュレーターにありますか?もしそうなら、それは iOS 4.2 シミュレーターの既知のバグです。このバグは、デバイス自体には影響しません。

于 2010-11-24T19:44:26.327 に答える
1

OpenGL ホスティング レイヤーとそれがサポートするビューをどのように設定していますか? ここここにある OpenGL ES サンプル アプリケーションを試してみると、どちらも 4.2 シミュレーターとデバイスで問題なく動作します。

おそらく、これらの例で使用されている初期化を自分のものと比較して、セットアップ プロセスで不足している可能性があるものがないかどうかを確認できます。

于 2010-11-25T02:32:59.547 に答える