Zwei Strategien bieten sich an, um das mehrfache Laden einer Textur zu verhindern. Zum einen kann man jeder Textur eine eindeutige ResourceID zuweisen. Vor dem Ladevorgang wird dann zunächst überprüft, ob es bereits eine Textur-Ressource mit der gleichen ID gibt. Man kann natürlich auch die Namen der geladenen Texturen speichern. Vor dem Laden einer neuen Textur wird dann zunächst überprüft, ob es bereits eine Textur-Ressource mit dem gleichen Namen gibt.
Unser Textur-Manager wird beide Strategien unterstützen. Verschaffen wir uns mal eine Übersicht über die neuen Funktionen für die Texturverwaltung:
// Funktionen für die Texturverwaltung:
void Set_NumTexturesMax(long numTexturesMax);
void Delete_TextureManager(void);
long Get_NumOfUsedTexures(void);
long Get_Unused_TexureResourceID(void);
void Release_Texture(CTexture** ppTexture, long ResourceID);
void Release_Texture(CTexture** ppTexture);
// Mehrfaches Laden einer Textur wird verhindert durch Vergleich der
// zugehörigen ResourceID mit bereits verwendeten ResourceIDs
// (jeder Textur muss vorab eine eindeutige ResourceID zugeordnet worden
// sein):
CTexture* LoadTexture(long ResourceID, char* szFileName,
BOOL MipMapping = FALSE);
CTexture* LoadTexture(long ResourceID, char* szFileName,
long TransparentColorBorderRed, long TransparentColorBorderGreen,
long TransparentColorBorderBlue, BOOL MipMapping = FALSE);
CTexture* LoadTexture_And_Calculate_SphericalNormalMap(long ResourceID,
char* szFileName, float HeightScale, BOOL MipMapping = FALSE);
CTexture* LoadTexture_And_Calculate_NormalMap(long ResourceID,
char* szFileName, float HeightScale, BOOL MipMapping = FALSE);
// Mehrfaches Laden einer Textur wird verhindert durch Vergleich des neuen
// Texturnamens mit bereits verwendeten Texturnamen:
CTexture* LoadTexture_And_Get_ResourceID(long* pResourceID,
char* szFileName, BOOL MipMapping = FALSE);
CTexture* LoadTexture_And_Get_ResourceID(long* pResourceID,
char* szFileName, long TransparentColorBorderRed,
long TransparentColorBorderGreen,
long TransparentColorBorderBlue, BOOL MipMapping = FALSE);
CTexture* LoadTexture_And_Calculate_SphericalNormalMap_And_Get_ResourceID(
long* pResourceID, char* szFileName, float HeightScale,
BOOL MipMapping = FALSE);
CTexture* LoadTexture_And_Calculate_NormalMap_And_Get_ResourceID(
long* pResourceID, char* szFileName, float HeightScale,
BOOL MipMapping = FALSE);
Hinweis:
Für die Ausführung dieses Programmbeispiels muss der Treiber Ihrer Grafikkarte die OpenGL Version 3.3 unterstützen.
Visual C++ 2010: DemoWithOpenGL2010_Tut16