لماذا لم يعد EaGlview الخاص بي لا يعرض في نظام التشغيل iOS 4.2؟

StackOverflow https://stackoverflow.com/questions/4270320

سؤال

الترقية إلى iOS SDK 4.2 أنا أواجه العديد من سوء التصرف في طلبي (طلب آخر هنا). الشخص الذي سأطلب مساعدتكم للحصول على مخاوف من وجهة نظر OpenGL (فئة فرعية EAGLVIEW) التي لا تجعل الطراز ثلاثي الأبعاد الذي أضعه.

يتم تخصيص العرض ويبدو أنه يتعرف على الإيماءات ولكن محتواها ليس مرئي (لقد راجعت أن الأمر يتعلق بالمنظر وليس سوء الاكتتاب من النموذج عن طريق تلوين الخلفية: لا يلونها من خلال glClearColor()).

عندما أقوم بالنقر فوقه مزدوجًا ، يجب تغيير حجمه (يذهب ملء الشاشة ، قبل أن يكون هذا الأمر قليلاً) يطلق على هذه الطريقة:

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

وبشكل سحري يظهر النموذج, ، وحتى الخلفية تصبح ملونة.

لدي طريقة تقوم بتغيير حجمها وتعيدها إلى إطارها السابق وموضعها المركزي ، وعندما يتم استدعاؤه يصبح العرض 'فارغة' تكرارا.

قبل أي اقتراح؟ (يمكنني نشر المزيد من الكود إذا لزم الأمر)

تحديثيحدث هذا على جهاز المحاكاة (لا يمكن اختباره على الجهاز في الوقت الحالي). إذا كان هذا خطأ معترف به ، فهل أي شخص يشير إلى مستندات Apple؟

تحديث 2أنا أستخدم OpenGL ES 1.1 وليس 2.0.

هذا ما أفعله في Eaglview layoutSubViews :

- (void)layoutSubviews 
{
    [EAGLContext setCurrentContext:_context];
    [self destroyFramebuffer];
    [self createFramebuffer];
    [self drawView];
}

وهذا هو بلدي createFramebuffer

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

إذا قمت بإنشاء العرض ، مما يمنحه إطارًا ملء الشاشة (320 × 480) يبدو أنه تم تقديمه بشكل صحيح. بطريقة ما ترتبط بأبعاد الرؤية

هل كانت مفيدة؟

المحلول

استغرق الأمر مني إلى الأبد لمعرفة هذا. لم يتم توثيقه جيدًا على الإطلاق ، لكنه في مستندات Apple. في نظام التشغيل 4.2 وأعلى ، تحتاج إلى أن يكون حجم EAGLVIEW مضاعفًا من 32 بكسل في كلا البعدين حتى يعمل.

نصائح أخرى

هل هذا في المحاكاة؟ إذا كان الأمر كذلك ، فهذا خطأ معروف في محاكي iOS 4.2. هذا الخطأ لا يؤثر على الأجهزة نفسها.

كيف تقوم بإعداد طبقة OpenGL التي تستضيفك والعرض الذي يعود إليه؟ عندما أجرب تطبيقات عينة OpenGL ES التي لدي هنا و هنا, ، يعمل كلاهما على ما يرام على محاكاة 4.2 ، وكذلك الجهاز.

ربما يمكنك مقارنة التهيئة المستخدمة في هذه الأمثلة مع نفسك ومعرفة ما إذا كان هناك شيء قد تكون في عداد المفقودين في عملية الإعداد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top