Возможно, не совсем то, что вы намеревались, но 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, а не свой собственный, потому что подсчет ссылок в многопоточных средах сложен). Последнее является причиной для закрытого конструктора копирования и оператора присваивания.