2010-04-03 1 views
7

Cela fait un moment que je me bats avec ça, et ce code se bloque avec, pour moi, des raisons inconnues. Je crée un FBO, je lie une texture, puis le tout premier glDrawArrays() se bloque avec un "EXC_BAD_ACCESS" sur mon iPhone Simulator.La création d'un FBO OpenGL ES 2.0 se passe mal avec une erreur inconnue

Voici le code que j'utilise pour créer l'OIR (et lier la texture et ...)

glGenFramebuffers(1, &lastFrameBuffer); 
glGenRenderbuffers(1, &lastFrameDepthBuffer); 
glGenTextures(1, &lastFrameTexture); 

glBindTexture(GL_TEXTURE1, lastFrameTexture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 768, 1029, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, NULL); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

//Bind/alloc depthbuf 
glBindRenderbuffer(GL_RENDERBUFFER, lastFrameDepthBuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 768, 1029); 

glBindFramebuffer(GL_FRAMEBUFFER, lastFrameBuffer); 

//binding the texture to the FBO :D 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, lastFrameTexture, 0); 

// attach the renderbuffer to depth attachment point 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, lastFrameDepthBuffer); 

[self checkFramebufferStatus]; 

Comme vous pouvez le voir participe à un objet, checkFrameBufferStatus ressemble à ceci:

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
switch(status) 
{ 
    case GL_FRAMEBUFFER_COMPLETE: 
    JNLogString(@"Framebuffer complete."); 
    return TRUE; 

    case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 
    JNLogString(@"[ERROR] Framebuffer incomplete: Attachment is NOT complete."); 
    return false; 

    case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 
    JNLogString(@"[ERROR] Framebuffer incomplete: No image is attached to FBO."); 
    return false; 

    case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 
    JNLogString(@"[ERROR] Framebuffer incomplete: Attached images have different dimensions."); 
    return false; 

    case GL_FRAMEBUFFER_UNSUPPORTED: 
    JNLogString(@"[ERROR] Unsupported by FBO implementation."); 
    return false; 

    default: 
    JNLogString(@"[ERROR] Unknown error."); 
    return false; 

JNLogString est juste un NSLog, et dans ce cas, il me donne:

2010-04-03 02:46:54.854 Bubbleeh[6634:207] ES2Renderer.m:372 [ERROR] Unknown error. 

Quand je l'appelle droit t ici. Donc, il plante, et le diagnostic me dit qu'il y a une erreur inconnue et que je suis coincé. J'ai fondamentalement copié le code à partir du Guide de programmation OpenGL ES 2.0 ...

Qu'est-ce que je fais de mal?

+0

genpfault: Vous sembliez avoir corrompu le corps un peu. Regle-le, s'il te plait. Merci d'avance. – Nick

Répondre

3
 glBindTexture(GL_TEXTURE1, lastFrameTexture); 

Ce n'est pas permis, je tente de lier la texture à une unité (GL_TEXTURE1), mais cela doit être fait par glActiveTexture(), et non par glBindTexture(), qui veut connaître le type de la texture (GL_TEXTURE_2D, GL_TEXTURE_3D, etc.) pas l'unité de texture. Pour placer une texture dans l'unité de texture 1 J'ai maintenant le code suivant que je pense est correct:

//Bind 2D Texture lastFrameTexture to texture unit 1 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, lastFrameTexture); 
1

Essayez d'utiliser glGetError après chaque appel GL. Spécialement le glTexImage2D.

+0

Merci, ça m'a beaucoup aidé. – Nick

0

Si vous utilisez XCode, ajoutez point d'arrêt pour les erreurs OpenGL dans "Breakpoint Navigator" ([+] -> [Ajouter Point d'arrêt d'erreur OpenGL ES]). Ensuite, tous les problèmes OpenGL seront affichés en ligne, où le problème apparaît.

Questions connexes