2009-04-19 25 views
9

Si por ejemplo se crea una matriz de píxeles, así:¿Qué sucede con los píxeles después de pasarlos a glTexImage2D()?

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

glTexImage2D(..., getPixels()); 

¿El glTexImage2D utilizar esa referencia o copiar los píxeles en su propia memoria?

Si la respuesta es la primera, ¿debería hacer lo siguiente?

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

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

Respuesta

9

De esta cita en el man page, suena como glTexImage2D asigna su propia memoria. Esto tendría sentido, idealmente la API OpenGL enviaría datos para ser almacenados en la propia tarjeta gráfica (si se permiten los controladores/implementación/etc).

En GL versión 1.1 o superior, los píxeles pueden ser un puntero nulo. En este caso, la memoria de textura se asigna para acomodar una textura de ancho ancho y altura alto. A continuación, puede descargar las subtexturas en para inicializar esta memoria de textura. La imagen no está definida si el usuario intenta para aplicar una parte no inicializada de la imagen de textura a una primitiva.

Así que sí, me imagino que no hay nada de malo en liberar la memoria una vez que haya generado su textura.

+0

No estoy seguro si ese es el caso en PC, pero en las funciones de carga de textura de consolas muy a menudo simplemente almacena puntero a textura y programa transferencia DMA para más tarde, por lo que no puede liberar memoria tan pronto devuelva la función. – n0rd

1

Sí, después de la llamada al geTexImage2D() devuelve es seguro descartar los datos que le pasó. de hecho, si no hacer que usted tiene una pérdida de memoria, como en este código:

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

glTexImage2D(..., getPixels()); 

pasar el puntero a la memoria intermedia a la llamada, pero entonces el puntero está perdido y fugas más probables. Lo que debe hacer es guardarlo y eliminarlo aftet los Retuns llamadas:

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

Alternativly, si la textura es de un tamaño constante, se puede pasar un puntero a una matriz que está en la pila:

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

por último, si usted no quiere preocuparse por apuntadores y arreglos, puede utilizar STL:

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

¡Uy! Mi fragmento inicial usó eliminar en lugar de eliminar [] para eliminar el buffer de píxeles. –

+0

en realidad, eliminar [] es lo que deberías estar usando. mi mal, arreglado ahora. por cierto, esta es exactamente la razón por la que debería usar STL :) – shoosh

+2

técnicamente, buf.begin() podría no funcionar, pero & buf [0] está garantizado para funcionar. En la mayoría de las implementaciones de STL, el iterador vectorial es un puntero, pero no tiene que serlo. –

0

Creo que tendría que llamar glDeleteTextures() después de haber terminado de dibujar sus píxeles, a liberar la memoria.

Cuestiones relacionadas