glGetRenderbufferParameterivOES返回错误的大小

时间:2012-08-06 14:19:21

标签: ios ios5 opengl-es

我目前正在开发一款需要在其视图的渲染缓冲区上绘制的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

如果我对结果(立即和延迟)不满意,我已经尝试人为地延迟调整大小或再次调用resize-function - 两者都没有成功。

在现有代码中加入很难/太难的解决方案是在纹理中渲染,然后在视图上绘制纹理。关于renderbuffers / EAGLDrawable我有什么遗漏,或者API不适合实时调整大小?

我已经检查过没有任何结果的glErrors。

1 个答案:

答案 0 :(得分:0)

我真的不确定为什么会这样,但这里有一些想法:

或许图层的后备存储在layoutSubviews时尚未更新。您可以尝试将其移至CADisplayLink回调,看看是否有更好的结果。

另一种选择是使用GLKView,如果您的目标是iOS 5+,或者允许CALayer在实时调整大小期间扩展其内容。