2009-04-19 9 views
9

Se per esempio creo un array di pixel, in questo modo:Cosa succede ai pixel dopo averli passati in glTexImage2D()?

int *getPixels() 
{ 
    int *pixels = new int[10]; 
    pixels[0] = 1; 
    pixels[1] = 0; 
    pixels[1] = 1; 
    // etc... 
} 

glTexImage2D(..., getPixels()); 

fa glTexImage2D utilizzare tale riferimento o copiare i pixel in essa la propria memoria?

Se la risposta è la prima, allora dovrei fare quanto segue?

int *p = getPixels(); 
glTexImage2D(..., p); 

/* Just changed to delete[], because delete 
* would only delete the first element! */ 
delete[] p; 

risposta

9

Da questa citazione nel man page, suona come glTexImage2D alloca la propria memoria. Questo avrebbe senso, idealmente l'API OpenGL invierebbe i dati per essere memorizzati sulla scheda grafica stessa (se i driver/implementazione/etc permesso).

Nella versione GL 1.1 o successiva, i pixel possono essere un puntatore nullo. In questo caso la memoria texture viene allocata per contenere una trama di larghezza e altezza. È quindi possibile scaricare sottotitoli su inizializzare questa memoria texture. L'immagine non è definita se l'utente prova per applicare una porzione non inizializzata dell'immagine texture a una primitiva.

Quindi sì, immagino che non vi sia alcun danno nel liberare la memoria una volta generata la trama.

+0

Non sono sicuro se questo è il caso su PC, ma su console le funzioni di caricamento texture molto spesso semplicemente memorizzano il puntatore su texture e programmano il trasferimento DMA per il tempo successivo, quindi non è possibile liberare memoria non appena la funzione viene restituita. – n0rd

1

Sì, dopo la chiamata al numero geTexImage2D() restituisce è sicuro scartare i dati passati. infatti, se non fare che avrete una perdita di memoria, come in questo codice:

int *getPixels() 
{ 
    int *pixels = new int[10]; 
    pixels[0] = 1; 
    pixels[1] = 0; 
    pixels[1] = 1; 
    // etc... 
} 

glTexImage2D(..., getPixels()); 

si passa il puntatore al buffer alla chiamata, ma poi il puntatore è perduto e più probabili perdite. Che cosa si dovrebbe fare è memorizzarlo ed eliminarlo aftet le Retuns chiamata:

int *pbuf = getPixels(); 
glTexImage2D(..., pbuf); 
delete[] pbuf; 

alternativly, se la trama è di una dimensione costante, è possibile passare un puntatore a una matrice che è in pila:

{ 
    int buf[10]; 
    ... 
    glTexImage2D(..., pbuf); 
} 

Infine, se non si vuole preoccupare puntatori e array, è possibile utilizzare STL:

vector<int> buf; 
fillPixels(buf); 
getTexImage2D(..., buf.begin()); 
+0

Oops! Il mio snippet iniziale utilizzava invece di delete [] per eliminare il buffer dei pixel. –

+0

effettivamente, elimina [] è quello che dovresti usare. il mio male, ora risolto. btw, questo è esattamente il motivo per cui dovresti usare STL :) – shoosh

+2

tecnicamente, buf.begin() potrebbe non funzionare, ma & buf [0] è garantito per funzionare. Nella maggior parte delle implementazioni STL il vettore iteratore è un puntatore, ma non deve essere. –

0

penso che avrebbe bisogno di chiamare glDeleteTextures() dopo aver finito di disegnare i tuoi pixel, a liberare la memoria.

Problemi correlati