如何删除我制作的所有纹理?假设我加载了一些纹理:
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个纹理而不是如何终止它们而不取名字?
答案 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而不是自己滚动,因为多线程环境中的引用计数很棘手)。后者是私有拷贝构造函数和赋值运算符的原因。