2011-02-22 13 views
5

Estoy intentando escribir una clase para fragmentar el sombreado mediante el uso de un Objeto Buffer de Cuadros para Renderizar Textura con un sombreador de Fimación, luego renderizar esa textura a otra textura con un sombreador de fragmentos, etc.glDeleteTextures que no eliminan la textura

Estoy tratando de lidiar con una pérdida de memoria en este momento, donde cuando cambio el tamaño de mi ventana y elimino/reasigno las texturas que estoy usando, las texturas no se eliminan correctamente.

Aquí es un fragmento de código:

//Allocate first texture 
glGenTextures(1, &texIds[0]); 
glBindTexture(GL_TEXTURE_2D, texIds[0]); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, screenX, screenY, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); 

//Allocate second texture 
glGenTextures(1, &texIds[1]); 
glBindTexture(GL_TEXTURE_2D, texIds[1]); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, screenX, screenY, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); 

//Try to free first texture -- ALWAYS FAILS 
glDeleteTextures(1, &texIds[0]); 
//Try to free second texture 
glDeleteTextures(1, &texIds[1]); 

Cuando ejecuto esto con gDEBugger, me dice "Advertencia:. El programa depurado eliminar una textura que no existe Nombre de textura: 1" cuando intento eliminar texIds [0]. (La razón por la que los tengo en una matriz en este momento es porque solía crearlos y liberarlos al mismo tiempo; sin embargo, cuando liberas 2 texturas a la vez, fallarán en silencio en una y continuarán con la otra).

Si no creo texIds [1], puedo liberar texIds [0], pero tan pronto como creo una segunda textura, ya no puedo liberar la primera textura que creo. ¿Algunas ideas?

+0

ese fragmento funciona para mí cuando declaro textos como 'GLuint texIds [2];' inmediatamente antes. tal vez el problema está en otra parte? – jakev

+0

@ 6NSString Extraño. glGetError() devuelve 0, pero gDEBugger me dice (y me muestra, si miro en el visor de texturas) que se están creando texturas extrañas. Estoy ejecutando OSX 10.6, si eso ayuda en absoluto. También intentaré crear un programa que solo contenga este código. – staticfloat

+1

Comentario bastante no relacionado: para cambiar el tamaño de una textura no es necesario eliminar y regenerar todo el objeto de textura, simplemente llama a 'glTexImage2D' con el nuevo tamaño. –

Respuesta

1

Quizás el error esté en texIds array. ¿Es una matriz de GLUint?

Podría declararlo erróneamente como una matriz de palabra, por lo tanto, al generar la textura para el elemento [1], un puntero uint tomado del elemento [0] se rompe.

Cuestiones relacionadas