2012-08-06 74 views
2

我目前正在研究需要在其視圖的渲染緩衝區上繪製的iOS應用程序。這些視圖可以通過手勢調整大小,因此我調整了渲染緩衝區的大小。glGetRenderbufferParameterivOES返回錯誤的大小

但是,當用戶將視圖調整爲快速時,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 

我已經試圖推遲人爲的調整或再次調用調整大小功能,如果我沒有滿意的結果(立即和德拉yed) - 都沒有成功。

一個很難/太難融入現有代碼的解決方案是渲染紋理,然後在視圖上繪製紋理。有什麼我缺少關於renderbuffers/EAGLDrawable或是不適合實時調整大小的API?

我已經檢查glErrors沒有任何結果。

+0

您發佈的代碼在哪裏運行?它在主線程上嗎?它是否在CADisplayLink回調中? – 2012-08-06 15:17:21

+0

它通過layoutSubviews在主線程(com.apple.main-thread)中調用。堆棧跟蹤如下: '0 - [MyClass resize] 1 - [MyClass layoutSubviews] 2 - [UIView(CALayerDelegate)layoutSublayersOfLayer:]' – user1512263 2012-08-07 08:39:40

回答

0

我真的不知道爲什麼會這樣,但這裏有一些想法:

也許層的後備存儲尚未在layoutSubviews時間更新。您可以嘗試將其移至CADisplayLink回調並查看是否有更好的結果。

如果您的目標是iOS 5+,或者可能允許CALayer在實時調整大小時對其內容進行縮放,那麼另一種方法是使用GLKView

+0

謝謝您的回答!我嘗試將調整大小的代碼移動到顯示鏈接,但不幸的是出現了相同的問題。似乎後臺緩衝區確實沒有正確調整大小,因爲重複(如在顯示鏈接中)大小的查詢返回相同的結果。 請您澄清一下您的意思是「允許CALayer在實時調整大小的過程中縮放其內容」? – user1512263 2012-08-08 08:22:28

+0

我的意思是,您可以避免調整渲染緩衝區的大小,直到實時調整大小完成後,並在CALayer上使用適當的內容模式,以確保事情看起來不錯。不過,我真的不明白爲什麼應該這樣做。 – 2012-08-08 11:37:15

相關問題