Ios6 将旧应用升级到iOS 6-iPhone 5上的open GL问题

Ios6 将旧应用升级到iOS 6-iPhone 5上的open GL问题,ios6,opengl-es,Ios6,Opengl Es,我终于升级了一个非常旧的通用游戏应用程序,我必须在新的操作系统和设备尺寸上玩得很好-我现在已经更新了所有东西,并瞄准了iOS 6.1,但当我在iPhone 5上运行它时,我的实际游戏内视图(使用OpenGL渲染为EagleView)的位置非常奇怪,显示了很多剪辑(见截图) 在我们第一次创建它时的“普通”设备上,一切都如预期的那样出现 在我的视图控制器中,我基本上为不同的设备加载了一个大小合适的nib——iPad和非4英寸设备的视图为1024x768,4英寸设备的视图为1136x640 然后,

我终于升级了一个非常旧的通用游戏应用程序,我必须在新的操作系统和设备尺寸上玩得很好-我现在已经更新了所有东西,并瞄准了iOS 6.1,但当我在iPhone 5上运行它时,我的实际游戏内视图(使用OpenGL渲染为EagleView)的位置非常奇怪,显示了很多剪辑(见截图)

在我们第一次创建它时的“普通”设备上,一切都如预期的那样出现

在我的视图控制器中,我基本上为不同的设备加载了一个大小合适的nib——iPad和非4英寸设备的视图为1024x768,4英寸设备的视图为1136x640

然后,在我的
viewdiload
中,我将视图的
self.view.contentScaleFactor
设置为
[UIScreen mainsScreen]scale]
,然后进行一些视图大小调整,如下所示(大致):

最后,我应用了一个变换,通过上面定义的一个因子来缩放视图,我刚刚手动调整了这个因子,然后旋转了它,因为这个应用程序只剩下了横向视图

 [self.view
    setTransform:
        CGAffineTransformConcat(CGAffineTransformMakeScale(DefaultViewScale,DefaultViewScale),
                                CGAffineTransformMakeRotation(-M_PI_2))];
然后初始化一个新的EAGLContext(openGL ES 1)

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代码,但请注意,我正在将GLVIEW设置为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);
这不是我最擅长的知识领域,所以如果我遗漏了什么,请告诉我,如果需要,我可以向你提供更多信息。如果有人有“a ha”或类似的经验,我将非常感谢一些正确方向的提示

谢谢

为什么你的“DefaultViewScale=1.2”会出现在iPad上?如果应用程序是全屏的,那么它就不应该再缩放了,因为它是1024x768。你是否在那里重新缩放

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

如果您有一个UIViewController,且HUD元素设置正确,则无需执行任何[self.view setTransform..。我感觉您让自己的生活变得更加复杂,那么它应该是!

只需将带有“UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth”的EagleView添加为ViewController主视图的最低子视图。并正确设置旋转代码().

看起来您正在进行的转换是在设置视图的框架之后进行的,因此可能会更改边界。我建议您中断绘制方法,并检查视图及其图层的边界

请记住,帧是从父对象的角度设置的,而边界是在本地坐标中。从UIView.h:

若视图已转换,则不要使用框架,因为它将无法正确转换 反映视图的实际位置。改为使用边界+中心


简短回答,开始使用
GLKView
而不是
EAGLView

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

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

  • 首先,将
    EAGLView
    替换为
    GLKView
    (确保在项目中引用
    GLKit.framework
  • 删除对
    setFramebuffer
    方法的调用。GLKit将为您处理此问题
  • 删除
    [self.view setTransform:
    调用。如果您的应用程序是全屏OpenGL,则无需使用视图转换。(如果不是,则可能仍然不需要)
  • 将视图的框架设置为屏幕的边界(例如,让它自动调整大小)。您可能可以在XIB中执行此操作
  • 确保在
    视图的某个地方调用
    [context setCurrentContext]
  • 应该差不多就是这样。还要确保将
    GLKView
    context
    属性设置为OpenGL上下文,就像
    EAGLView
    一样

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


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

我注意到在你的第一段代码中对宽屏外壳的调用并没有遵循其他外壳的模式:你有CGPointMake(160293),我认为它应该是(看看其他外壳)CGPointMake(160284).这可能是问题所在吗?不幸的是,@GuyRT,那没有效果。不过抓得好!
[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);
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);