Как удалить все текстуры, сделанные сразу? - PullRequest
0 голосов
/ 24 августа 2011

Как я могу удалить все текстуры, которые я сделал?Предположим, я загружаю несколько текстур:

GLuint tx_wall,tx_floor,tx_tiles;
tx_wall=LoadTexture("tex_wall.raw",512,512),
tx_floor=LoadTexture("tex_floor.raw",512,512),
tx_tiles=LoadTexture("tex_tiles.raw",512,512);

, затем использую их:

glBindTexture(GL_TEXTURE_2D,tx_wall);
  glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f(0,   0,  0);
    glTexCoord2f(1, 0); glVertex3f(0,  50,  0);
    glTexCoord2f(1, 1); glVertex3f(0,   0, 14);
    glTexCoord2f(0, 1); glVertex3f(0,  50, 14);
  glEnd();
glBindTexture(GL_TEXTURE_2D,tx_floor);
  glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f(0,   0,  0);
    glTexCoord2f(1, 0); glVertex3f(50,  50, 0);
    glTexCoord2f(1, 1); glVertex3f(50,  50, 0);
    glTexCoord2f(0, 1); glVertex3f(0,   0,  0);
  glEnd();
(and so on)

и, когда игра заканчивается, удаляет их:

glDeleteTextures(1,&tx_wall);
glDeleteTextures(1,&tx_floor);
glDeleteTextures(1,&tx_tiles);

Все работает нормальноно если у меня будет 10 или 20 текстур, то как мне их всех прекратить, не принимая их имена?

Ответы [ 2 ]

5 голосов
/ 24 августа 2011

Если вы поместите все идентификаторы текстуры в массив, вы можете удалить их все за один вызов, используя glDeleteTextures (точно так же, как вы можете сгенерировать их все за один вызов, используя glGenTextures).

GLuint textures[3];
glGenTextures(3, textures);

/* ... */

glDeleteTextures(3, textures);
4 голосов
/ 24 августа 2011

Возможно, не совсем то, что вы намеревались, но RAII был бы разумным вариантом:

class Texture
{
public:
    Texture( const std::string& name, int width, int height ) :
        m_id( LoadTexture(name.c_str(),width,height) )
    {
    }

    ~Texture()
    {
        if(m_id)
            glDeleteTextures(1,&m_id);
        m_id = 0;
    }

    GLuint id() const
    {
        return m_id;
    }

private:
    Texture( const Texture& );
    Texture& operator=( const Texture& );

    GLuint m_id;
};

Использование:

Texture tx_wall("tex_wall.raw",512,512);
Texture tx_floor("tex_floor.raw",512,512);
Texture tx_tiles("tex_tiles.raw",512,512);

и

glBindTexture(GL_TEXTURE_2D,tx_wall.id());
  glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f(0,   0,  0);
    glTexCoord2f(1, 0); glVertex3f(0,  50,  0);
    glTexCoord2f(1, 1); glVertex3f(0,   0, 14);
    glTexCoord2f(0, 1); glVertex3f(0,  50, 14);
  glEnd();
glBindTexture(GL_TEXTURE_2D,tx_floor.id());
  glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f(0,   0,  0);
    glTexCoord2f(1, 0); glVertex3f(50,  50, 0);
    glTexCoord2f(1, 1); glVertex3f(50,  50, 0);
    glTexCoord2f(0, 1); glVertex3f(0,   0,  0);
  glEnd();

Преимущество заключается в том, что вы можете сохранять текстуры только до тех пор, пока они вам нужны, код безопасен для исключений, а освобождение текстур происходит автоматически. Недостатком является то, что вы не можете копировать объекты Texture без какого-либо подсчета ссылок (для чего я бы рекомендовал использовать boost :: shared_ptr, а не свой собственный, потому что подсчет ссылок в многопоточных средах сложен). Последнее является причиной для закрытого конструктора копирования и оператора присваивания.

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