2012-10-22 12 views
6

Sto usando Xcode 4.5.1 e sto provando su un iPhone5 con iOS6.Il frame capture in Xcode fallisce

Stavo usando la funzione di acquisizione frame senza problemi, ma all'improvviso ha smesso di funzionare. Quando premo il pulsante di acquisizione dei fotogrammi, sembra che il fotogramma sia stato catturato e il telefono passa a una schermata vuota, per poi tornare improvvisamente alla schermata dell'applicazione e l'applicazione continua a funzionare. Posso ancora eseguire il debug e mettere in pausa l'applicazione, ma non c'è modo di ottenere l'acquisizione del frame. Neanche io vedo errori nella console.

La ragione per cui ha smesso di funzionare è questa parte di codice. Questo codice dovrebbe rappresentare qualcosa in un rendertexture, ma il rendertexture sembra vuoto. Ho voluto utilizzare la funzione di cattura fotogramma per scoprire che cosa c'è che non va, ma il codice stesso non mi permette di catturare ... :(

Qualsiasi idea del perché

// ------------- init function ----------------- 
// Create the framebuffer and bind it 
glGenFramebuffers(1, &g_framebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, g_framebuffer); 
//Create the destination texture, and attach it to the framebuffer’s color attachment point. 
glGenTextures(1, &g_texture); 
glBindTexture(GL_TEXTURE_2D, g_texture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_texture, 0);  
//Test the framebuffer for completeness 
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ; 
if(status != GL_FRAMEBUFFER_COMPLETE) { 
    NSLog(@"failed to make complete framebuffer object %x", status); 
} else { 
    NSLog(@"SkyPlugin initialized"); 
} 


// ----------------- on update ------------------ 
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFBO); 
glGetIntegerv(GL_VIEWPORT, oldViewPort); 
// set the framebuffer and clear 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindFramebuffer(GL_FRAMEBUFFER, g_framebuffer); 
glViewport(0, 0, 32, 32); 
//glClearColor(0.9f, 0.1f, 0.1f, 1.0f); 
glDisable(GL_DEPTH_TEST); 
glClear(GL_COLOR_BUFFER_BIT); 
// Set shader 
glUseProgram(m_program); 
// do some glEnableVertexAttribArray 
// ... 
// texture setting 
glActiveTexture(GL_TEXTURE0); 
glUniform1i(m_uniform, 0); 
ResourceManager* resourceManager = ResourceManager::GetInstance(); 
glBindTexture(GL_TEXTURE_2D, m_texture[0]); 
// ----------- Draw ----------- 
// Draws a full-screen quad to copy textures 
static const vertexDataUV quad[] = { 
    {/*v:*/{-1.f,-1.f,0}, /*t:*/{0,0}}, 
    {/*v:*/{-1.f,1,0}, /*t:*/{0,1}}, 
    {/*v:*/{1,-1.f,0}, /*t:*/{1,0}}, 
    {/*v:*/{1,1,0}, /*t:*/{1,1}} 
}; 
static const GLubyte indeces[] = {0,2,1,3}; 
glVertexAttribPointer(m_posAttrib, 3, GL_FLOAT, 0, sizeof(vertexDataUV), &quad[0].vertex); 
glVertexAttribPointer(m_texCoordAttrib, 2, GL_FLOAT, 0, sizeof(vertexDataUV), &quad[0].uv); 
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, indeces); 
// ------------ End 
// go back to the main framebuffer! 
glBindFramebuffer(GL_FRAMEBUFFER, oldFBO); 
glViewport(oldViewPort[0], oldViewPort[1], oldViewPort[2], oldViewPort[3]); 
glEnable(GL_DEPTH_TEST); 
//glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 

Edit:? (2012/Ottobre/28)

ho scoperto perché il codice di cui sopra non funzionava. ho dimenticato di associare un render tampone! il codice qui sotto lavori, ma ancora la cattura frame fallisce quando questo codice è attivo ...

Su init,

// Creare il renderbuffer e collegarlo glGenRenderbuffers (1, & g_renderbuffer); glBindRenderbuffer (GL_RENDERBUFFER, g_renderbuffer); glRenderbufferStorage (GL_RENDERBUFFER, GL_RGBA8_OES, w, h);

// Create the framebuffer and bind it 
glGenFramebuffers(1, &g_framebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, g_framebuffer); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, 
          GL_COLOR_ATTACHMENT0, 
          GL_RENDERBUFFER, g_renderbuffer); 
//Create the destination texture, and attach it to the framebuffer’s color attachment point. 
glGenTextures(1, &g_texture); 
glBindTexture(GL_TEXTURE_2D, g_texture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_texture, 0); 

On aggiornamento,

glGetIntegerv(GL_RENDERBUFFER_BINDING, &oldRBO); 
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFBO); 
glGetIntegerv(GL_VIEWPORT, oldViewPort); 

// set the framebuffer and clear 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindFramebuffer(GL_FRAMEBUFFER, g_framebuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, g_renderbuffer); 
glViewport(0, 0, 32, 32); 

// ... draw stuff ... 

Fine dell'aggiornamento,

// go back to the main framebuffer! 
glBindFramebuffer(GL_FRAMEBUFFER, oldFBO); 
glBindRenderbuffer(GL_RENDERBUFFER, oldRBO); 
+1

Abbiamo esattamente lo stesso problema.( – Split

+1

L'unico log che ho potuto ottenere è: ' 28/10/12 7: 02: 19.818 PM Xcode [5371]: [MT] DVTAssertions: Avviso in/SourceCache/GPUDebuggeriOSSupport/GPUDebuggeriOSSupport-51.8/GPUiOSReplayController.m: 127 Dettagli: replayer terminato in modo non corretto oggetto: Metodo: -_handleGuestAppStatusChangeNotification: Discussione: {name = (null), num = 1} prega Segnala un errore su http://bugreport.apple.com con questo messaggio di avviso e qualsiasi informazione utile che puoi fornire. ' – endavid

risposta

2

Sembra che fosse un bug di Xcode. L'ultima versione, Xcode 4.5.2 mi permette di catturare il fotogramma :)

Dopo aver catturare il fotogramma, ottengo un errore in questa parte del codice:

// ... draw stuff ... 
glActiveTexture(GL_TEXTURE0); 
glUniform1i(MY_TEXTURE, 0); 

Sulla glUniform1i ottengo questo errore: "L'operazione specificata non è valida per lo stato OpenGL corrente".

Nessuna idea perché ottengo questo errore (la resa è di lavoro), ma ho il sospetto questo errore potrebbe essere la ragione per cui non ero in grado di catturare un fotogramma nella precedente versione di Xcode ...

+0

Il motivo dell'errore è che stavo impostando una uniforme (MY_TEXTURE) non definita nello shader (la il nome del campionatore era diverso). Dovrei provare ancora con Xcode 4.5.1 senza errori e vedere se l'acquisizione funziona ... ma chi userà comunque una versione precedente di Xcode? ;) – endavid

0

Ho visto un comportamento molto simile, e mentre era un po 'irregolare, sembrava essere correlato all'utilizzo della memoria. Di solito quando falliva, l'applicazione di riproduzione sembrava avere esaurito la memoria (vedrei un avvertimento di memoria nella console quando falliva).

Passare a un dispositivo con più memoria fisso (iPad 4 da iPad 3), ma sono stato anche in grado di aggirarlo occasionalmente riducendo la quantità di memoria texture utilizzata - saltando impostando il top mipmap per tutte le mie trame di solito libera abbastanza.