c++ - hacer - ¿Qué pasa con los píxeles después de pasarlos a glTexImage2D()?
como hacer un pixel de seguimiento (3)
Sí, después de que la llamada a geTexImage2D()
devuelve, es seguro descartar los datos que le pasó. de hecho, si no lo haces, tendrás 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());
Pasa el puntero al búfer a la llamada pero luego el puntero se pierde y es muy probable que se pierda. Lo que debe hacer es almacenarlo y eliminarlo después de la devolución de la llamada:
int *pbuf = getPixels();
glTexImage2D(..., pbuf);
delete[] pbuf;
alternativamente, si la textura es de un tamaño constante, puede pasar un puntero a una matriz que está en la pila:
{
int buf[10];
...
glTexImage2D(..., pbuf);
}
Finalmente, si no quiere preocuparse por los punteros y matrices, puede usar STL:
vector<int> buf;
fillPixels(buf);
getTexImage2D(..., buf.begin());
Si, por ejemplo, creo una matriz de píxeles, así:
int *getPixels()
{
int *pixels = new int[10];
pixels[0] = 1;
pixels[1] = 0;
pixels[1] = 1;
// etc...
}
glTexImage2D(..., getPixels());
¿GlTexImage2D usa esa referencia o copia 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;
Creo que tendrías que llamar a GlDeleteTextures () una vez que hayas terminado de dibujar tus píxeles para liberar la memoria.
A partir de esta cita en la página man , parece que 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 para inicializar esta memoria de textura. La imagen no está definida si el usuario intenta aplicar una parte no inicializada de la imagen de textura a una primitiva.
Así que sí, me imagino que no hay nada malo en liberar el recuerdo una vez que hayas generado tu textura.