我終於升級了一個非常古老的通用遊戲應用程序我必須適應更新的操作系統和設備大小 - 我已經更新了一切,並將iOS 6.1定位到正確的位置現在,但是當我在iPhone 5上運行它時,我的實際遊戲視圖(使用開放式GL渲染到EAGLView中)非常奇怪,顯示了很多剪輯(請參見屏幕截圖)。將舊應用程序升級到iOS 6 - 在iPhone 5上打開GL問題
在保留它們在我們第一次創造了這個時候,「正常」的設備,如預期出現的一切。
在我的視圖控制器,我基本上加載筆尖與不同設備設置正確的大小 - iPad和非4" 的設備得到了1024×768視圖和4" 設備得到一個新的1136x640視圖。
然後,在我的viewDidLoad
,我建立了我的觀點的self.view.contentScaleFactor
到[UIScreen mainsScreen] scale]
,我然後做一些視圖大小,像這樣(大約):
if(iPad){
[self.view setFrame:CGRectMake(0, 0,1024,768)];
[self.view setCenter:CGPointMake(384,512)];
DefaultViewScale=1.2;
}else if(WideScreen){
[self.view setFrame:CGRectMake(0, 0, 568, 320)];
[self.view setCenter:CGPointMake(160, 293)];
DefaultViewScale = 1.0f;
}else{
[self.view setFrame:CGRectMake(0, 0,480,320)];
[self.view setCenter:CGPointMake(160,240)];
DefaultViewScale=1.0f;;
}
最後,我申請通過轉換來縮放視圖上面定義的因素,我只是手動調整,然後旋轉它,因爲該應用程序僅適用於Landscape-Left。
[self.view
setTransform:
CGAffineTransformConcat(CGAffineTransformMakeScale(DefaultViewScale,DefaultViewScale),
CGAffineTransformMakeRotation(-M_PI_2))];
然後我初始化一個新的EAGLContext(OpenGL ES的1),
[(EAGLView *)self.view setContext:context];
[(EAGLView *)self.view setFramebuffer];
setFramebuffer主要是:
[EAGLContext setCurrentContext:context];
// Create default framebuffer object.
glGenFramebuffers(1, &defaultFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
glGenRenderbuffers(1, &colorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
glViewport(0, 0, framebufferWidth, framebufferHeight);
有一些更多的樣板EAGLView代碼,但請注意,我設置無論gl的glViewport告訴我它的寬度和高度是從UIView的圖層大小抓取的。
最後它設置了投影矩陣:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, self.view.frame.size.width , 0, self.view.frame.size.height, -1, 1);
glMatrixMode(GL_MODELVIEW);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND_SRC);
glEnableClientState(GL_VERTEX_ARRAY);
glDisable(GL_DEPTH_TEST);
// Set the colour to use when clearing the screen with glClear
glClearColor(51.0/255.0,135.0/255.0,21.0/255.0, 1.0f);
glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);
這是不我所知最強的區域,所以讓我知道如果我錯過了一些東西,我可以給你更多的信息,如果需要。如果任何人有「一哈」或類似的經驗,我會感激一些正確的方向提示。
謝謝
我注意到你的第一個代碼塊中的WideScreen情況的'setCenter'調用不符合其他情況下的模式:你有我認爲應該是的CGPointMake(160,293)案例)CGPointMake(160,284)。這可能是問題嗎? – GuyRT
不幸的是,@GuyRT,這沒有效果。儘管如此,趕上! – Mustafakidd