seguimiento hacer google conversion como c++ opengl glteximage2d

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.