2011-08-05 33 views
2

我對openGL相當陌生,我一直在嘗試一些關於我正在閱讀的iphone上的遊戲編程的示例代碼。 其中一個樣本是3D遊戲,我能夠在iOS模擬器(全屏)上成功編譯並運行它。iOS/openGL ES - 重寫drawRect似乎使openGL函數「glGetRenderbufferParameterivOES」行爲不當了?

我遇到的問題是當我在實際的硬件上運行它時(ipod touch 4G),遊戲沒有全屏顯示(它只佔用屏幕的1/4)。我能夠縮小問題降低到下面的代碼:

GLint backingWidth, backingHeight; 

- (BOOL) bindLayer 
{ 
.... 

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); 

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); 

.... 
} 

出於某種原因,backingWidth和backingHeight被設置爲640和960以上(I預期它的調用後分別爲320×480,其是iphone的屏幕尺寸)。在iOS模擬器和較舊的iPod touch(2g)上,它工作得很好。

上面的代碼是UIView的子類的一部分,並覆蓋了drawRect方法(雖然它是空的)。讓我感到困惑的是當我刪除drawRect方法(因此不會覆蓋它)時,它以某種方式解決了我上面描述的問題。

任何人都可以對此有所瞭解嗎?在OpenGL中繪圖時覆蓋視圖的drawRect方法是否安全?爲什麼它在模擬器和較舊的iPod touch上工作?

回答

4

您看到一個神器,這是由於具有Retina顯示器的較新設備上的點和像素的差異造成的。正如我在回答here中所描述的那樣,UIKit使用點對其進行尺寸調整,該點與舊設備上的像素1:1映射,但現在在當前Retina顯示器上具有1:2映射。

相反,OpenGL ES使用像素進行測量,這就是爲什麼在查詢其背景尺寸時看到640x960被返回的原因。這是應該用於OpenGL ES場景的視口的大小。

我猜你在試圖運行的代碼中的某個地方是將你的OpenGL ES場景的視口設置爲視圖或圖層中點的大小,而不是像素中的適當大小。這導致它縮小到視圖的四分之一,就像我上面鏈接的答案中發生的情況一樣。查找glViewPort()和相關調用,並確保它們使用的是背景寬度和高度,而不是視圖或圖層寬度和高度。

-drawRect:應與此無關,除非某處存在設置視口大小的代碼。

+0

太棒了。非常感謝!剛剛嘗試過,它工作! –