2011-12-01 133 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分配的內存。

相關問題