2011-12-01 136 views
0

我有一个GLTexture类从文件初始化纹理用下面的方法:GL_TEXTUREs是否需要释放/释放?

void GLTexture::LoadBMP(char *name) 
{ 
    // Create a place to store the texture 
    AUX_RGBImageRec *TextureImage[1]; 

    // Set the pointer to NULL 
    memset(TextureImage,0,sizeof(void *)*1); 

    // Load the bitmap and assign our pointer to it 
    TextureImage[0] = auxDIBImageLoad(name); 

    // Just in case we want to use the width and height later 
    width = TextureImage[0]->sizeX; 
    height = TextureImage[0]->sizeY; 

    // Generate the OpenGL texture id 
    glGenTextures(1, &texture[0]); 

    // Bind this texture to its id 
    glBindTexture(GL_TEXTURE_2D, texture[0]); 

    // Use mipmapping filter 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 

    // Generate the mipmaps 
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); 

    // Cleanup 
    if (TextureImage[0]) 
    { 
     if (TextureImage[0]->data) 
      free(TextureImage[0]->data); 

     free(TextureImage[0]); 
    } 
} 

哪个不处置,似乎数据。纹理,然后在程序中使用通过调用这个函数

void GLTexture::Use() 
{ 
    glEnable(GL_TEXTURE_2D);        // Enable texture mapping 
    glBindTexture(GL_TEXTURE_2D, texture[0]);    // Bind the texture as the current one 

} 

由于质地必须以某种方式驻留在内存中为它能够被束缚,我想知道如果任何额外的清洁任务是由于在退出?或者在加载方法中是否足够....

+3

这似乎是“阅读文档”的好候选 –

+0

请不要使用AUX库来加载图像。即使它适合你,也只会鼓励其他人这样做。 –

回答

2

是的,你应该使用glDeleteTextures。你可能在退出时没有它,因为你的整个上下文将被销毁,但最好的做法是无论如何。

+0

另外,正如Alf说的那样,阅读文档,甚至可以从页面底部获得'glGenTextures'! – slugonamission

2

您应该使用

glDeleteTextures

+0

@icecoder非常感谢您的帮助!因此,如果我的GLTexture类具有'unsigned int texture [1];'它用于'glGenTexture',我应该为GLTexture的每个实例调用'glDeleteTextures(1,&texture)',或者有办法将它们全部删除一旦? – Alex

+0

你应该像这样调用'glDeleteTextures':'glDeleteTextures('n',&texture);''其中'n'是要删除的纹理的数量。 http://www.opengl.org/sdk/docs/man/xhtml/glDeleteTextures.xml – Cyclonecode

1

free你在你的示例代码看,是释放从文件加载数据所需的调用。

当调用gluBuild2DMipmaps,OpenGL的副本从您传递给它的源数据,但你的纹理OpenGL的拷贝(实际纹理)仍驻留在内存中(这就是为什么你可以在free调用之后使用它) 。

当您完成使用贴图时,您应该调用glDeleteTextures以释放OpenGL分配的内存。

相关问题