2010-06-19 8 views
8

Sto cercando qualcosa di similecome utilizzare glCopyImage2D

glEnable(texture_2d) 
glBindTexture 
glCopyTexImage2D 
glDisable(GL_TEXTURE_2D); 

Penso glCopyTexImage2D non funziona con un non-potere dell'immagine due, quindi questo è un problema; Ho anche provato glReadPixels, ma è troppo lento per i miei scopi.

+0

Sai se il problema è nella creazione della trama o successivamente nel renderlo? 'GlCopyTexImage2D' seguito da' glGetTexImage' produce lo stesso risultato di 'glReadPixels'? (non consigliato come soluzione a lungo termine per motivi di prestazioni, ma come un passo per la risoluzione dei problemi relativi alla trama) –

+0

Per la restrizione di power-of-2, è possibile utilizzare 'glTexImage2D' per allocare la trama con un potere -di-2 dimensioni e passando 'NULL' per i dati, quindi' glCopyTexSubImage2D' che consente dimensioni non power-of-2. –

risposta

9

Se glReadPixels è troppo lento per voi, quindi glCopyTexImage2D e glCopyTexSubImage2D non saranno molto più veloci. Sulle piattaforme con supporto per oggetti framebuffer, come iOS, il metodo consigliato (cioè più veloce) per ottenere i dati di immagine renderizzati GPU in una texture consiste nell'utilizzare tale texture come allegato per un oggetto framebuffer e renderizzarla direttamente. Detto questo, se vuoi ancora seguire questo metodo, ecco cosa devi fare per risolverlo:

Per prima cosa, stai passando argomenti errati a glCopyTexImage2D. Il terzo argomento, internalformat, dovrebbe essere probabilmente GL_RGBA anziché 0. Se avessi chiamato glGetError dopo aver chiamato glCopyTexImage2D, probabilmente avresti ottenuto GL_INVALID_OPERATION. Vedere le pagine man di OpenGL ES 1.1 per glCopyTexImage2D e glCopyTexSubImage2D.

In secondo luogo, come già osservato, lo glCopyTexImage2D richiede che gli argomenti larghezza e altezza siano anche power-of-two. Il modo corretto per risolvere questo problema consiste nell'assegnare un'immagine texture utilizzando glTexImage2D (è possibile passare NULL per pixels qui), quindi utilizzare glCopyTexSubImage2D per copiare il contenuto del framebuffer in un rettangolo. Notare che glCopyTexSubImage2D non accetta un argomento internalformat, poiché sta aggiornando un sottorettangolo di una trama, utilizza il formato esistente della trama.

Per la cronologia, glGetTexImage non esiste in OpenGL ES 1.1 o 2.0, motivo per cui si sta ottenendo una dichiarazione implicita.

+0

Sembra che dovrei esaminare gli oggetti framebuffer ... Grazie – Adam

1

È possibile verificare se la scheda video supporta la non potenza di 2 trame se supporta l'estensione ARB_texture_non_power_of_two. See here for info.

0

Per aiutare a capire se il "non-potenza di due" cosa è un problema, utilizzare glGetError() in questo modo:

printf("error: %#06x\n", glGetError()); 

Metti che in luoghi diversi nel codice per assicurarsi quale linea è la causa del problema, quindi controllare il codice di errore qui: https://www.khronos.org/opengl/wiki/OpenGL_Error

Per copiare una texture che ho fatto:

glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0); 
glGenerateMipmap(GL_TEXTURE_2D); 

dopo vincolante la texture. Controlla i documenti su queste due funzioni per maggiori informazioni.