2010-04-03 8 views
7

Ho sofferto con questo per un po 'di tempo e questo codice si blocca con, per me, ragioni sconosciute. Sto creando un FBO, legando una texture, e quindi il primo glDrawArrays() si blocca con un "EXC_BAD_ACCESS" sul mio iPhone Simulator.OpenGL ES 2.0 La creazione di un FBO non funziona con errore sconosciuto

Ecco il codice che uso per creare il FBO (e legare consistenza e ...)

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

Come si può vedere questo partecipa a un oggetto, checkFrameBufferStatus assomiglia a questo:

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 è solo un NSLog, e in questo caso mi dà:

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

Quando io chiamo T Qui.

Quindi, si blocca e la diagnostica mi dice che c'è un errore sconosciuto e sono un po 'bloccato. Ho praticamente copiato il codice dalla Guida alla programmazione di OpenGL ES 2.0 ...

Cosa sto facendo male?

+0

genpfault: Sembra che tu abbia corrotto un po 'il corpo. Per favore aggiustalo. Grazie in anticipo. – Nick

risposta

3
 glBindTexture(GL_TEXTURE1, lastFrameTexture); 

che non è permesso, ho cercato di impegnare la consistenza di un'unità (GL_TEXTURE1), ma che dovrebbe essere fatto da glActiveTexture(), non per glBindTexture(), che vuole conoscere il tipo di trama (GL_TEXTURE_2D, GL_TEXTURE_3D, ecc.) Non l'unità di trama. Per inserire una texture in unità di texture 1 ora ho il seguente codice che credo sia corretto:

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

Provare a utilizzare glGetError dopo ogni chiamata GL. Specialmente lo glTexImage2D.

+0

Grazie, mi ha aiutato molto. – Nick

0

Se si utilizza XCode, aggiungere punto di interruzione per errori di OpenGL in "Punto di interruzione Navigator" ([+] -> [Aggiungi OpenGL ES Error Breakpoint]). Quindi tutti i problemi OpenGL verranno visualizzati in linea, dove compare il problema.