如何删除一次制作的所有纹理?

时间:2011-08-24 15:03:56

标签: c++ opengl

如何删除我制作的所有纹理?假设我加载了一些纹理:

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 个答案:

答案 0 :(得分:5)

如果您将所有纹理标识符放在一个数组中,则可以使用glDeleteTextures在一次调用中删除它们(就像您可以使用glGenTextures在一次调用中生成它们一样)。

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

/* ... */

glDeleteTextures(3, textures);

答案 1 :(得分:4)

也许不完全是你想要的,但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而不是自己滚动,因为多线程环境中的引用计数很棘手)。后者是私有拷贝构造函数和赋值运算符的原因。