首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的EAGLVIew不再在iOS 4.2中呈现?

为什么我的EAGLVIew不再在iOS 4.2中呈现?
EN

Stack Overflow用户
提问于 2010-11-24 18:39:32
回答 3查看 3.2K关注 0票数 3

升级到iOS SDK4.2,我在我的应用程序中遇到了几个错误行为(另一个是这里)。我要向您求助的是一个OpenGL视图(一个EAGLView子类),它不再呈现我要放入的3d模型。

视图被分配,它似乎识别手势,但它的内容是不可见的(我已经检查它是关于视图的,而不是通过着色背景而不是模型的错位:它没有通过glClearColor()对其着色)。

当我双击它时,它将调整大小(它会变成全屏,在此之前是一个小UIVIew),它调用这个方法:

代码语言:javascript
运行
复制
- (void)animateToGrow{
    DNSLog(@"grow");
    grow = YES;
    oldFrame = self.frame;
    oldCenter = self.center;

    [UIView beginAnimations:@"MoveAndStrech" context:nil];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationBeginsFromCurrentState:YES];

    self.frame = CGRectMake(0, 0, WIDTH, HEIGHT); 
    self.center = CGPointMake(CENTER_X, CENTER_Y);
    [UIView commitAnimations];
    [self setupGLPerspectiveNear:0.1 far:1000];
}

神奇的是,模型出现了,甚至背景也被着色了。

我有一个方法来调整它的大小,并使它回到以前的帧和中心位置,当它被调用时,视图又变成‘空’了。

在有什么建议之前?(如果需要,我可以发布更多的代码)

UPDATE正在模拟器上进行(目前无法在设备上进行测试)。如果这是一个公认的错误,是否有人从苹果文档中引用?

更新2 --我使用的是OpenGL ES1.1,而不是2.0。

下面是我在EAGLView的layoutSubViews中所做的工作:

代码语言:javascript
运行
复制
- (void)layoutSubviews 
{
    [EAGLContext setCurrentContext:_context];
    [self destroyFramebuffer];
    [self createFramebuffer];
    [self drawView];
}

这是我的createFramebuffer

代码语言:javascript
运行
复制
- (BOOL)createFramebuffer
{
    glGenFramebuffersOES(1, &_viewFramebuffer);
    glGenRenderbuffersOES(1, &_viewRenderbuffer);
    
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, _viewFramebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, _viewRenderbuffer);
    [_context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)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 (_useDepthBuffer) 
    {
        glGenRenderbuffersOES(1, &_depthRenderbuffer);
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, _depthRenderbuffer);
        glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, _backingWidth, _backingHeight);
        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, _depthRenderbuffer);
    }
    
    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;
}

更新3

如果我创建视图,为其提供全屏框架(320x480),则它将正确呈现。在某种程度上,它与视图维度相关。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-29 20:24:26

我花了很长时间才发现这个。没有很好的记录,但它在苹果的文档里。在os 4.2及更高版本上,您需要EAGLview大小在两个维度上都是32个像素的倍数才能工作。

票数 13
EN

Stack Overflow用户

发布于 2010-11-24 19:44:26

这是模拟器里的吗?如果是这样的话,那么这就是iOS 4.2模拟器中的一个已知错误。此bug不会影响设备本身。

票数 2
EN

Stack Overflow用户

发布于 2010-11-25 02:32:59

你是如何设置你的OpenGL-托管层和它支持的视图?当我尝试拥有这里这里这里 ES示例应用程序时,两者都在4.2模拟器和设备上运行得很好。

也许您可以将这些示例中使用的初始化与您自己的初始化进行比较,看看在安装过程中是否缺少一些内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4270320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档