Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL iOS 2d 4英寸显示器_Ios_Opengl Es - Fatal编程技术网

OpenGL iOS 2d 4英寸显示器

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

我正在尝试让一个4英寸的显示器在2d OpenGL iOS应用程序中正常工作。它适用于3.5英寸显示器和所有IPad显示器,但在4英寸显示器中去掉了底部88像素。我尝试了不同版本的启动映像,但根本没有启动映像。我还尝试了MainWindow.xib和no.xib的不同变体

Xcode 5中的OpenGL示例对3d应用程序很有效,但我在尝试将其转换为2d时遇到了很大的问题。我使用的代码基于较旧的GLSprite示例

它似乎在创建帧缓冲区时表现出来。在下面的示例中,当backingHeight应为568时,它始终返回480像素。谢谢

- (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;
}