2012-01-24 8 views
6

Mam problem z pobieraniem mojego utworzonego programowo widoku OpenGL do pracy na niektórych wersjach/urządzeniach iOS. Wydaje się być najczęściej na urządzeniach Jailbroken, ale zdarza się również na zwykłych urządzeniach. Wygląda na to, że jest tylko v4.1 lub 4.2.1, że zawiedzie.Nie można utworzyć pełnego bufora ramki 8cd6 (iOS, programowo utworzony widok OpenGL)

Posiadane przeze mnie urządzenie jest jailbreak (nie jest moje i na pewno nie jest moim wyborem do jailbreak it!) I ma na nim v4.1 (8B117) iOS.

Błąd wynosi 8cd6, co oznacza, że ​​nie udało się dołączyć framebuffera (lub czegoś podobnego do tych linii).

Szukałem i przeszukano, ale żadne z innych rozwiązań, które znalazłem, nie pomogło. Większość z nich używa również bufora głębi, ale moje ma charakter czysto 2D i nie ma bufora głębi.

Oto jak utworzyć buforów:

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); 

Inne wartości Setup:

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

To linia "Nie udało się dokonać kompletnego obiektu bufora ramki", które zostaje wywołany z kodem błędu 8cd6.

+0

Możesz spróbować dodać kilka wywołań do 'glGetError()', aby sprawdzić, czy wszystko przed tym połączeniem się powiedzie. – user1118321

+1

8CD6 ('GL_FRAMEBUFFER_INCLOMPLETE_ATTACHMENT') nie oznacza, że" nie udało się dołączyć bufora ramki "(cokolwiek masz na myśli przez to), ale ten jeden z jego załączników (tekstura lub renderbuffer powiązany z załącznikiem koloru lub głębi) jest niekompletny. Wygląda więc na to, że pamięć podręczna do renderowania jest w jakiś sposób zepsuta. –

+0

Czy jesteś pewien, że prawidłowe wywołanie FBO jest powiązane podczas wywoływania 'glCheckFramebufferStatus'? –

Odpowiedz

4

Mam to posortowane dzięki dwóm użytkownikom powyżej, którzy pomogli mi zrealizować coś.

przeniosłem tworzenie buforów z funkcji init klasy i stworzyła dwie nowe funkcje:

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

I następnie dodaje połączeń do nich na początku funkcji resizeFromLayer:

[self destroyFrameBuffer]; 
[self createFrameBuffer]; 
+0

Po pierwsze, jest to aktualizacja twojego pytania i brak odpowiedzi. Po drugie, nie powiedziałeś, że to rozwiązało cokolwiek. W tym przypadku może to być odpowiedź. Ale trzeci, nawet wtedy byłby zły, ponieważ niszczycie i tworzycie nowego FBO za każdym razem, gdy okno/cokolwiek jest zmieniane. Byłoby tylko obejście prawdziwego problemu, który musi być gdzie indziej. –

+2

"Mam to posortowane dzięki dwóm użytkownikom powyżej, którzy pomogli mi coś zrealizować." - jak to się stało, że nie mówię, że rozwiązał problem? Ta metoda wydaje się być dość standardowym sposobem radzenia sobie z nią w systemie iOS. – AnonymousReality

+0

Chistian w iOS niszczysz i ponownie tworzysz bufor ramki, gdy devide jest ponownie zorientowany - co wymaga zmiany jego rozmiaru. Jest to standardowy sposób robienia tego w iOS. – badweasel

0

Używam cocos2d v2.x użyłem powyżej rozwiązanie do tworzenia mojego rozwiązania, które rozwiązać mój problem: simliar

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

Właśnie miał ten sam problem w projekcie pracuję nad

błędu drukowanej jest:

Nie udało się powiązać EAGLDrawable: do GL_RENDERBUFFER 1

udało się zrobić kompletny bufora ramki obiektu 8cd6

do tego musiałem naprawić, aby upewnić oznaczyć tylko pogląd na przerysować a jego self.window nie jest zerowa.

Używam GLKView z własną CADisplayLink

+0

Miałem podobny problem, tylko problem polegał na tym, że mój GLKView miał zerowy rozmiar. Self.window nie było zerowe, a jeśli wstrzymywałem rendering, dopóki rozmiar nie był pusty (może autosizing jeszcze nie działał), działało dobrze. – prewett

0

Po spędzeniu dużo czasu znalazłem rozwiązanie tego problemu „Nie udało się dokonać kompletnego obiektu bufora ramki” używam stosując maskowanie na CCSprite, ale zanim zainicjować metod OpenGL sprawia, że ​​maskowanie jest możliwe Dodaję sprite w widoku, przed dodaniem musisz dodać scheduler 1 sekundy i w tym harmonogramie dodać swój ccsprite w widoku.

Pozdrawiam!

Powiązane problemy