سؤال

تابعت برنامجًا تعليميًا باستخدام العازلة العمق في OpenGL ES 1.1. لكني أستخدم OpenGL ES 2.0. ينتج عن الرمز المطبق خطأ: فشل في جعل كائن FrameBuffer الكامل 8CD6. انظر الرمز المطبق أدناه:

 (void)createFramebuffer
{
   if (context && !defaultFramebuffer)
   {
        [EAGLContext setCurrentContext:context];

        // Create default framebuffer object.
        glGenFramebuffers(1, &defaultFramebuffer);
        glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);

        // Create color render buffer and allocate backing store.
        glGenRenderbuffers(1, &colorRenderbuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);

        // Create depth render buffer
        glGenRenderbuffers(1, &depthRenderbuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);

        [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth);
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);

        glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, framebufferWidth, framebufferHeight);

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);


        if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
            NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
    }
}

تحياتي نيكلاس

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

المحلول

تكمن المشكلة في أنك تخزين ربط مرتين لـ Depth RenderBuffer الخاص بك ، ولا تصل إلى اللون الخاص بك أبدًا. ال -renderbufferStorage:fromDrawable: تربط رسالة إلى eaGlContext الخاص بك تخزينًا إلى RenderBuffer المربوطة حاليًا ، والذي في حالتك هو RenderBuffer العمق. فيما يلي ، تقوم بربط التخزين به مرة أخرى باستخدام glRenderbufferStorage مكالمة.

يتمثل الحل في ربط Color RenderBuffer قبل إرسال رسالة التخزين ، بحيث يحصل التخزين على حدود لذلك. وهذا هو ، أدخل خط glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); مباشرة فوق الرسالة ، بعد إنشاء عمق RenderBuffer. يجب أن تنجح ، تمكنت من إعادة إنتاج خطأك ثم حلها في وقت لاحق بهذه الطريقة.

NB. تأكد دائمًا من ربط المخازن المؤقتة الصحيحة. يمكنك التحقق من استخدام glGetIntegerv() للربط ، و glGetRenderbufferParameteriv() لمعلمات إضافية.

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