私は現在、ビューのレンダーバッファーを描画する必要がある 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 を既にチェックしました。