将旧应用程序升级到iOS 6 - 在iPhone 5上打开GL问题

时间:2013-06-23 03:22:00

标签: ios6 opengl-es

我终于升级了一个非常古老的通用游戏应用程序,我必须使用更新的操作系统和设备尺寸 - 我已经更新了所有内容并立即定位到iOS 6.1但是当我在iPhone 5上运行它时,我的实际在游戏视图中,使用开放GL渲染到EAGLView中,定位非常奇怪并且显示了很多剪辑(见截图)。

4" retina simulator screenshot

在我们第一次创建它时的“普通”设备上,一切都按预期显示。

3.5" retina simulator

在我的视图控制器中,我基本上为不同设备加载了一个具有正确尺寸的笔尖 - iPad和非4“设备获得1024x768视图,而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;;
}

最后,我应用一个转换来按照上面定义的因子缩放视图,我只是手动调整然后旋转它,因为应用程序只是横向左侧。

 [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代码,但请注意我将glViewport设置为gl告诉我它的宽度和高度是从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);

这是不是我最强大的知识领域,所以如果我错过了某些内容,请告诉我,如果需要,我可以为您提供更多信息。如果有人有“哈哈”或类似的经历,我会欣赏一些正确方向的提示。

由于

4 个答案:

答案 0 :(得分:2)

简短回答,开始使用GLKView代替EAGLView

首先,了解设置的最佳做法的好方法,例如最新版本的iOS中的OpenGL上下文是使用“OpenGL游戏”模板创建一个新项目,并查看参考。

最重要的区别是GLKView(在iOS 5.0中引入),它极大地简化了您的工作。它将处理您现在手动执行的大部分操作,包括设置视口。

  • 首先将EAGLView替换为GLKView(确保在项目中引用GLKit.framework)。
  • 删除对setFramebuffer方法的调用。 GLKit会为您解决这个问题。
  • 删除[self.view setTransform:]电话。如果您的应用是全屏OpenGL,则无需使用视图转换。 (事实并非如此,可能仍然不需要它。)
  • 将视图的帧设置为屏幕的边界(例如,通过让它自动调整大小)。您可以在XIB中执行此操作。
  • 请务必在[context setCurrentContext]的某个地方拨打viewDidLoad
  • 那应该或多或少。另外,请确保将context的{​​{1}}属性设置为OpenGL上下文,就像GLKView一样。

答案 1 :(得分:1)

我建议确保您的发布图片是最新的。

OpenGL绝对不是我的专业领域,但在将Flash游戏升级到iOS 6时我遇到了类似的问题。我没有为新iPhone等的视网膜显示提供适当的launch images和我的应用程序在“兼容模式”下运行,屏幕顶部和底部有边距。不可否认,你没有这些利润,但它可能会弄乱你的应用程序认为它的屏幕有多大。可能值得一试。

答案 2 :(得分:0)

为什么iPad上的“DefaultViewScale = 1.2”?如果应用程序是全屏的,则不应再缩放,因为它是1024x768。你在那里重新调整了什么吗?

在我的OpenGL应用程序中,我只有一个始终全屏的EAGLView,然后从framebufferWidth / height读取大小。

如果你有一个UIViewController,正确设置了HUD-Elements,你就不需要做任何[self.view setTransform ..]。我觉得你让自己的生活更复杂,那应该是!
只需添加带有“UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth”的EAGLView作为ViewControllers主视图的最低子视图。并正确设置旋转代码(keep in mind the iOS5 calls so shouldAutoRotateToInterfaceOrientation:.. are deprecated)。

答案 3 :(得分:0)

看起来你正在进行的转换是在设置视图的框架之后,因此可以改变边界。我建议打破你的draw方法并检查视图及其图层的界限。

请记住,框架是从父级的角度设置的,而边界是在本地坐标中。来自UIView.h:

  如果视图被转换,

不使用frame,因为它不正确   反映视图的实际位置。使用bounds + center。