Ios GLGetRenderBufferParameterives返回错误的大小
我目前正在开发一个iOS应用程序,它需要利用其视图的renderbuffer。可以通过手势调整这些视图的大小,因此,我正在调整renderbuffer的大小 但是,当用户将视图大小调整为fast时,Ios GLGetRenderBufferParameterives返回错误的大小,ios,ios5,opengl-es,Ios,Ios5,Opengl Es,我目前正在开发一个iOS应用程序,它需要利用其视图的renderbuffer。可以通过手势调整这些视图的大小,因此,我正在调整renderbuffer的大小 但是,当用户将视图大小调整为fast时,glGetRenderBufferParameterives(GL_RENDERBUFFER_OES、GL_RENDERBUFFER_WIDTH_OES和backingWidth)返回错误的值 glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuff
glGetRenderBufferParameterives(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);
虽然快速调整大小(这里是增长,而不是收缩)给了我以下输出(这不好,差异太大)
如果我对结果不满意(立即和延迟),我已经尝试过人工延迟调整大小或再次调用resize函数,但都没有成功
在现有代码中很难合并的解决方案是在纹理中渲染,然后在视图上绘制纹理。renderbuffers/EagleDrawable是否有什么我遗漏的地方,或者API是否不适合实时调整大小
我已经检查了Glerror,但没有任何结果。我真的不知道为什么会发生这种情况,但这里有一些想法:
可能在layoutSubviews
时间层的备份存储尚未更新。您可以尝试将其移动到CADisplayLink
回调,看看是否有更好的结果
如果您的目标是iOS 5+,另一种选择是使用GLKView
,或者允许CALayer
在live resize期间缩放其内容。我真的不确定为什么会发生这种情况,但以下是一些想法:
可能在layoutSubviews
时间层的备份存储尚未更新。您可以尝试将其移动到CADisplayLink
回调,看看是否有更好的结果
如果您的目标是iOS 5+,另一种选择是使用GLKView
,或者允许CALayer
在live resize期间缩放其内容。您发布的代码在哪里运行?它在主线上吗?它是否在CADisplayLink回调中?它在主线程(com.apple.main thread)中通过LayoutSubview调用。堆栈跟踪如下所示:0-[MyClass resize]1-[MyClass layoutSubviews]2-[UIView(CALayerDelegate)LayoutSublayerOfLayer:
您发布的代码在哪里运行?它在主线上吗?它是否在CADisplayLink回调中?它在主线程(com.apple.main thread)中通过LayoutSubview调用。堆栈跟踪如下所示:0-[MyClass resize]1-[MyClass layoutSubviews]2-[UIView(CALayerDelegate)LayoutSublayerOfLayer:
谢谢您的回答!我尝试将调整大小的代码移动到显示链接,但不幸的是,出现了相同的问题。备份缓冲区的大小似乎没有正确调整,因为对大小的重复查询(如在显示链接中)会返回相同的结果。请澄清“允许CALayer在实时调整大小期间缩放其内容”是什么意思?我的意思是,在实时调整大小完成之前,您可以避免调整渲染缓冲区的大小,并在CALayer上使用适当的内容模式以保持外观正常。我真的不明白为什么需要这样做。谢谢你的回答!我尝试将调整大小的代码移动到显示链接,但不幸的是,出现了相同的问题。备份缓冲区的大小似乎没有正确调整,因为对大小的重复查询(如在显示链接中)会返回相同的结果。请澄清“允许CALayer在实时调整大小期间缩放其内容”是什么意思?我的意思是,在实时调整大小完成之前,您可以避免调整渲染缓冲区的大小,并在CALayer上使用适当的内容模式以保持外观正常。不过,我真的不明白为什么需要这样做。
_ 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