2

私は現在、ビューのレンダーバッファーを描画する必要がある iOS アプリに取り組んでいます。これらのビューはジェスチャーでサイズ変更できます。その結果、レンダーバッファーのサイズを変更しています。

ただし、ユーザーがビューのサイズを高速に変更すると、glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);間違った値が返されます。

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);

if(NO == [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(id<EAGLDrawable>)self.layer]) {
    NSLog(@"renderBufferStorage unsucessful!");
}
NSLog(@"_ %d %d", (int)self.layer.bounds.size.width, (int)self.layer.bounds.size.height);
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);

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(@"+ %d %d", backingWidth, backingHeight);

ゆっくりとサイズ変更すると、次の出力が得られます (これは多かれ少なかれ問題ありません)。

_ 452 321
+ 450 319
_ 453 322
+ 452 321
_ 453 322
+ 452 321
_ 453 323
+ 453 323

高速サイズ変更(ここでは縮小ではなく拡大)により、次の出力が得られます(これは問題ありません。違いが大きすぎます)

 _ 491 350
 + 456 325
 _ 555 394
 + 491 348
 _ 548 390
 + 554 394
 _ 540 384
 + 548 390
 _ 459 326
 + 539 383
 _ 389 277
 + 459 326
 _ 313 222
 + 389 275

結果に満足できない場合(即時および遅延)、人為的にサイズ変更を遅らせるか、サイズ変更関数を再度呼び出すことをすでに試みましたが、どちらも成功しませんでした。

既存のコードに組み込むのが非常に/難しすぎる解決策は、テクスチャでレンダリングしてから、ビュー上にテクスチャを描画することです。renderbuffers / EAGLDrawable について不足しているものはありますか、それとも API はリアルタイムのサイズ変更に適していませんか?

結果なしで glErrors を既にチェックしました。

4

1 に答える 1

0

これがなぜ起こっているのかはよくわかりませんが、ここにいくつかの考えがあります:

レイヤーのバッキング ストアが更新されていない可能性がありますlayoutSubviews。これをコールバックに移動して、CADisplayLinkより良い結果が得られるかどうかを確認できます。

別の方法としてGLKView、iOS 5 以降をターゲットにしている場合に使用するか、CALayerライブ サイズ変更中にコンテンツをスケーリングできるようにすることもできます。

于 2012-08-07T12:37:06.873 に答える