我试图在2d OpenGL iOS应用程序中获得4英寸显示器的正确工作。它在3.5英寸显示器和所有IPad显示器上工作得很好,但在4英寸显示器上切掉了底部88像素。我尝试了不同版本的启动图像,根本没有启动图像。我也尝试过不同版本的主窗口。Xib和没有。Xib。
Xcode 5中的OpenGL示例适用于3d应用程序,但我在尝试将其转换为2d时遇到了大问题。我使用的代码是基于旧的GLSprite样本。
它似乎在创建帧缓冲区时表现出来。在下面的例子中,backingHeight总是返回480像素,而它应该是568像素。谢谢。
- (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;
}
感谢大家的回复。我承认,在设置视图和帧缓冲区时,我真的不知道自己在做什么。下面是如何设置初始视图。它指的是一种叫做"笔尖文件"的东西,我似乎找不到。在这段代码中有什么地方我应该把视图大小逻辑?我还说我试图在没有.xib文件的情况下做到这一点,但我错了。我不介意使用GLKit,但我还没有找到一个简单的例子,渲染2d背景纹理,就像我想做的。
//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;
}
负责此操作的行是[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(id<EAGLDrawable>)self.layer];
。如果height的返回值总是480,那么视图本身很可能具有480的高度(尝试确认)。
如果是这样,那么我想找到设置它到这个高度的最快方法是重写setFrame:
方法并添加一个断点。