Не удалось создать полный объект фреймбуфера 8cd6 (iOS, программно созданное представление OpenGL) - PullRequest
7 голосов
/ 24 января 2012

У меня возникла проблема с тем, чтобы мой программно созданный вид OpenGL работал на определенных версиях / устройствах iOS.Похоже, что это наиболее часто встречается на взломанных устройствах, но также происходит на обычных устройствах.Похоже, что это только v4.1 или 4.2.1, на котором происходит сбой.

Устройство, которое у меня есть, взломано (это не мое и, конечно, не мой выбор сделать джейлбрейк!) И имеет v4.1 (8B117) iOS на нем.

Ошибка 8cd6, что означает, что она не смогла подключить кадровый буфер (или что-то в этом духе).

Я искал и искал, но ни один издругие решения, которые я нашел, помогли.Большинство из них также используют буфер глубины, но у меня чисто 2D и нет буфера глубины.

Вот как я создаю буферы:

glGenFramebuffersOES(1, &defaultFramebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);

glGenRenderbuffersOES(1, &colorRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);

glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);

Другие значения настройки:

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

glDisable(GL_DEPTH_TEST);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND_SRC);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

int* mts = calloc(1, sizeof(int));
glGetIntegerv(GL_MAX_TEXTURE_SIZE, mts);

resizeFromLayer:

-(BOOL) resizeFromLayer: (CAEAGLLayer*) _layer
{
    // Allocate color buffer backing based on the current layer size
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);

    NSLog(@"Layer Bounds: %f x %f", _layer.bounds.size.width, _layer.bounds.size.height);
    NSLog(@"Layer Position: %f x %f", _layer.bounds.origin.x, _layer.bounds.origin.y);
    if(![context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable: _layer])
    {
        NSLog(@"renderBufferStorage failed!");
    }

    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
    NSLog(@"Backing: %d x %d", backingWidth, 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;
}

Строка «Не удалось создать полный объект кадрового буфера» вызывается с кодом ошибки 8cd6.

Ответы [ 4 ]

4 голосов
/ 25 января 2012

Я отсортировал его благодаря двум вышеупомянутым пользователям, которые помогли мне кое-что реализовать.

Я переместил создание буферов из функции init класса и создал две новые функции:

-(void) destroyFrameBuffer
{
    // Tear down GL
    if (defaultFramebuffer)
    {
        glDeleteFramebuffersOES(1, &defaultFramebuffer);
        defaultFramebuffer = 0;
    }

    if (colorRenderbuffer)
    {
        glDeleteRenderbuffersOES(1, &colorRenderbuffer);
        colorRenderbuffer = 0;
    }
}

-(void) createFrameBuffer
{
    // Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer
    glGenFramebuffersOES(1, &defaultFramebuffer);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);

    glGenRenderbuffersOES(1, &colorRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);

    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);
}

Затем я добавил к ним вызовы в начале функции resizeFromLayer:

[self destroyFrameBuffer];
[self createFrameBuffer];
2 голосов
/ 09 сентября 2015

У меня была такая же проблема в проекте, над которым я работаю

Распечатана ошибка:

Не удалось связать EAGLDrawable: с GL_RENDERBUFFER 1

Не удалось создать полный объект кадрового буфера 8cd6

Чтобы исправить это, я должен был убедиться, что я помечаю только представление для перерисовки, пока его self.window не равно nil .

Я использую GLKView со своим собственным CADisplayLink

0 голосов
/ 29 июня 2016

Потратив много времени, я нашел решение для этого "Не удалось создать полный объект кадрового буфера", который я использую, используя маскировку на CCSprite, но прежде чем инициализировать методы opengl, которые делают возможным маскирование, я добавляю спрайт в представление, прежде чем добавить вам нужно добавить планировщик в 1 секунду и в этом планировщике добавить свой ccsprite в представление.

Ура!

0 голосов
/ 09 июля 2014

Я использую Cocos2d v2.x. Я использовал вышеупомянутое решение для создания своего решения, которое решило мою проблему:

 -(void) destroyFrameBuffer
 {
   // Tear down GL
    if (_defaultFramebuffer)
    {
       glDeleteFramebuffers(1, &_defaultFramebuffer);
       _defaultFramebuffer = 0;
    }

    if (_colorRenderbuffer)
    {
       glDeleteRenderbuffers(1, &_colorRenderbuffer);
       _colorRenderbuffer = 0;
    }


 }

 -(void) createFrameBuffer
 {
    // Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer
    glGenFramebuffers(1, &_defaultFramebuffer);
    NSAssert( _defaultFramebuffer, @"Can't create default frame buffer");

    glGenRenderbuffers(1, &_colorRenderbuffer);
    NSAssert( _colorRenderbuffer, @"Can't create default render buffer");

    glBindFramebuffer(GL_FRAMEBUFFER, _defaultFramebuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderbuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderbuffer);

}

- (BOOL)resizeFromLayer:(CAEAGLLayer *)layer
{

    [self destroyFrameBuffer];
    [self createFrameBuffer];
    etc.....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...