ios - OpenGL iOS 2d 4 英寸显示器

标签 ios opengl-es

我正在尝试让 4 英寸显示器在 2d OpenGL iOS 应用程序中正常工作。它适用于 3.5 英寸显示器和所有 iPad 显示器,但在 4 英寸显示器中切掉底部 88 像素。我尝试了不同版本的启动图像,但根本没有启动图像。我还尝试了 MainWindow.xib 的不同变体,但根本没有 .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;
}

感谢大家的回复。我承认我真的不知道在设置 View 和帧缓冲区时我在做什么。以下是初始 View 的设置方式。它指的是一种叫做“nib 文件”的东西,我似乎找不到它。这段代码中有什么地方可以放置 View 大小逻辑吗?我还说过我尝试在没有 .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]; 。如果高度的返回值始终为 480,则 View 本身的高度很可能为 480(尝试确认)。

如果是这样,那么我想找到将其设置为该高度的最快方法是覆盖 setFrame:方法并添加断点。

关于ios - OpenGL iOS 2d 4 英寸显示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24956145/

相关文章:

iphone - 限制可用的本地化

ios - 使用与 OpenGL 版本中相同的代码移动 OpenGL ES 纹理

android - 我们什么时候应该使用 LAYER_TYPE_HARDWARE

android - 如何在 libgdx 中创建加载屏幕?

ios - 在 iOS 上使用语音输入后视频停止

ios - subview 返回时得到通知

iOS - Dropbox API : How to have a UIProgressView which displays the average value of datas sended to Dropbox?

ios - Core-Plot 多个 y 轴对齐问题 - 可能与缩放有关

iphone - 单色触摸 : Enable Multisampling in OpenGL ES 2. 0

javascript - WebGl - 只能绘制一个对象