OpenGL iOS 2d 4英寸显示器
我正在尝试让一个4英寸的显示器在2d OpenGL iOS应用程序中正常工作。它适用于3.5英寸显示器和所有IPad显示器,但在4英寸显示器中去掉了底部88像素。我尝试了不同版本的启动映像,但根本没有启动映像。我还尝试了MainWindow.xib和no.xib的不同变体 Xcode 5中的OpenGL示例对3d应用程序很有效,但我在尝试将其转换为2d时遇到了很大的问题。我使用的代码基于较旧的GLSprite示例 它似乎在创建帧缓冲区时表现出来。在下面的示例中,当backingHeight应为568时,它始终返回480像素。谢谢OpenGL iOS 2d 4英寸显示器,ios,opengl-es,Ios,Opengl Es,我正在尝试让一个4英寸的显示器在2d OpenGL iOS应用程序中正常工作。它适用于3.5英寸显示器和所有IPad显示器,但在4英寸显示器中去掉了底部88像素。我尝试了不同版本的启动映像,但根本没有启动映像。我还尝试了MainWindow.xib和no.xib的不同变体 Xcode 5中的OpenGL示例对3d应用程序很有效,但我在尝试将其转换为2d时遇到了很大的问题。我使用的代码基于较旧的GLSprite示例 它似乎在创建帧缓冲区时表现出来。在下面的示例中,当backingHeight应为5
- (BOOL)createFramebuffer
{
glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(id<EAGLDrawable>)self.layer];
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);
if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
return NO;
}
return YES;
}
负责此操作的行是
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(id)self.layer]代码>。如果高度的返回值始终为480,则视图本身的高度很可能为480(请尝试确认)
如果是这样的话,那么我想找到将其设置到这个高度的最快方法是重写setFrame:
方法并添加断点。这是错误所在,但可能不是问题的根源@user3633620:Xcode 5(及更新版本)OpenGL ES游戏模板在所有显示器尺寸上都能正常工作的部分原因是它使用了。您正在使用的代码既旧(它为ES2+中的核心功能使用ES1.1扩展名),又做了比您自己需要做的更多的工作(从而使您面临更多的bug和维护问题)。GLKView只是一个绑定UIView和openGL的包装器。它存在的唯一原因是帮助那些不想深入openGL的人。我永远不会使用它,也不会向任何人推荐它,因为它产生的问题比它解决的问题多。至于ES 1和ES 2,如果固定管道适合您的需要,那么它应该比非固定管道性能更好(但不确定它是否适合)。不管怎样,这个代码是合法的,应该可以工作…谢谢大家的回答。我能够将:[self-setFrame:CGRectMake(0,0320568)]添加到上面的视图初始化代码中,并且成功了。但是,有没有办法确定正在使用的设备大小?谢谢,再次感谢大家。我能够使用CGRect screenRect=[[UIScreen mainScreen]bounds]获得屏幕高度,并按照Matic的建议使用了setFrame。我同意Matic的观点,更愿意使用OpenGL,因为GLKView太乱了。通常不需要找到屏幕边界。通常在视图控制器中设置openGL视图的大小。视图控制器本身已经包含一个大小等于屏幕大小的视图。如果可能的话,试着使用它。我的意思不是让你重写这个方法来强制屏幕值,而是简单地找出调用这个方法的错误参数并在那里修复它。
//The GL view is stored in the nib file. When it's unarchived it's sent -initWithCoder:
- (id)initWithCoder:(NSCoder*)coder
{
if((self = [super initWithCoder:coder])) {
// Get the layer
CAEAGLLayer *eaglLayer = (CAEAGLLayer*) self.layer;
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if(!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer]) {
[self release];
return nil;
}
animating = FALSE;
displayLinkSupported = FALSE;
animationFrameInterval = 1;
displayLink = nil;
animationTimer = nil;
// A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer
// class is used as fallback when it isn't available.
NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
displayLinkSupported = TRUE;
[self setupView];
[self drawView];
}
return self;
}