是否需要释放/释放GL_TEXTURE?

时间:2011-12-01 23:56:26

标签: c++ opengl

我有一个GLTexture类,它使用以下方法从文件初始化纹理:

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 :(得分:2)

是的,你应该使用glDeleteTextures。你可能会在没有退出的情况下离开,因为你的整个环境都会被破坏,但无论如何最好这样做。

答案 1 :(得分:2)

你应该使用

glDeleteTextures

答案 2 :(得分:1)

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

调用gluBuild2DMipmaps时,OpenGL 复制来自您传递给它的源的数据,但纹理的OpenGL副本(实际纹理)仍然驻留在内存中(这就是为什么你可以在free电话后使用它。

完成纹理后,应调用glDeleteTextures以释放OpenGL分配的内存。