Нужно ли освобождать / освобождать GL_TEXTURE? - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть класс 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 ]

2 голосов
/ 02 декабря 2011

Вы должны использовать

glDeleteTextures

2 голосов
/ 02 декабря 2011

Да, вы должны использовать glDeleteTextures.Скорее всего, вы сможете обойтись без него при выходе, так как весь ваш контекст будет разрушен, но в любом случае лучше делать это.

1 голос
/ 02 декабря 2011

free, который вы видите в своем примере кода, - это вызов, необходимый для освобождения данных, загруженных из файла.

При вызове gluBuild2DMipmaps OpenGL копирует данные изисточник, который вы передаете ему, но копия вашей текстуры OpenGL (фактическая текстура) все еще находится в памяти (поэтому вы можете использовать ее после вызова free).

Когда вы закончите использовать текстуры,Вы должны вызвать glDeleteTextures , чтобы освободить память, выделенную OpenGL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...