GL_TEXTUREs需要被释放吗?

Do GL_TEXTUREs need to be released/freed?

本文关键字:释放 TEXTUREs GL      更新时间:2023-10-16

我有一个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
}

由于纹理必须以某种方式驻留在内存中才能被绑定,我想知道退出时是否有任何额外的清理任务?或者加载方法中的那个是否足够....

是的,你应该使用glDeleteTextures。您可能可以在退出时不使用它,因为您的整个上下文将被销毁,但无论如何,这样做是最佳实践。

你应该使用

glDeleteTextures

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

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

当你完成使用纹理,你应该调用glDeleteTextures以释放由OpenGL分配的内存