لماذا لا يدعو glMatrixMode (GL_PROJECTION) تعطيني EXC_BAD_ACCESS في التطبيق فون؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

ولدي التطبيق فون حيث أدعو هذه الوظائف الثلاث في appDidFinishLaunching:

glMatrixMode(GL_PROJECTION);
glOrthof(0, rect.size.width, 0, rect.size.height, -1, 1);
glMatrixMode(GL_MODELVIEW);

عند التنقل خلال مع المصحح أحصل EXC ACCESS BAD عندما تنفيذ السطر الأول. أي أفكار لماذا هذا يحدث؟

وراجع للشغل لدي تطبيق آخر حيث أن أفعل الشيء نفسه، وأنه يعمل بشكل جيد. حتى لقد حاول تكرار كل شيء في هذا التطبيق (#imports، مضيفا إطار OpenGLES، الخ)، ولكن الآن أنا مجرد عالقة.

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

المحلول

ولقد واجهت هذا مع برنامج OpenGL يدعو إذا خيطين تحاول رسم على الساحة برنامج OpenGL في آن واحد. ومع ذلك، لا يبدو ما تفعلونه.

هل صحيح تهيئة السياق العرض ومخزن الإطار المؤقت قبل هذه الدعوة؟ على سبيل المثال، في بلدي فرعية UIView أن يفعل برنامج OpenGL الرسم، أسميه التالية في initWithCoder لها: الأسلوب:

context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

if (!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer]) 
{
    [self release];
    return nil;
}

وطريقة 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 (USE_DEPTH_BUFFER) {
        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) 
    {
        return NO;
    }

    return YES;
}

وهذا هو الى حد كبير كود النمطي، والتي تم إنشاؤها بواسطة قالب برنامج OpenGL ES التطبيق في كسكودي. ربما من خلال عدم تهيئة الأمور قبل استدعاء glMatrixMode ()، وكنت الحصول على الحادث.

وأيضا، لماذا تفعلون برنامج OpenGL الرسم في applicationDidFinishLaunching :؟ لن تحكم عرض أو عرض أن يكون مكانا أكثر ملاءمة ليدعو برنامج OpenGL من UIApplicationDelegate بك؟

نصائح أخرى

ومن غير المحتمل أن المشكلة بالنظر إلى التاريخ الذي قدمت علة، ولكن كنت أيضا نرى شيئا مثل هذا إذا كنت تستخدم أبل سبيل المثال رمز وتشغيل على جهاز قادر ES 2.0، كما أنه يزيل كومة مصفوفة من المواصفات، على الرغم من أن تعريفات الدالة سيبقى ظاهرا للمترجم منذ الجهاز يدعم أيضا ES 1.1.

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

ويمكن التأكد من أن المستطيل لا تزال تخصص؟

وتحتاج إلى استبدال المصفوفة الحالية مع مصفوفة الوحدة قبل استدعاء glOrthof. ويمكن القيام بذلك مع glLoadIdentity ()

وإعادة تشغيل محاكي فون. هذه المسألة هي بالتأكيد بسبب سياق برنامج OpenGL لم يتم تعيين بشكل صحيح. لقد وجدت أنه في بعض الأحيان المحاكية فون لديه مشاكل، ويحتاج إلى إعادة لسياق برنامج OpenGL للحصول على تعيين بشكل صحيح من قبل [EAGLContext setCurrentContext:].

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