OpenGL Tutorial (Version 3.3) – Texturverwaltung (Download)

In den vorangegangenen Programmbeispielen haben wir die verwendeten Texturen stets dort geladen, wo sie benötigt wurden (in der CCursor-Klasse, in der CSolarSystemBackground-Klasse, usw.). In der Praxis ist dieses Verfahren jedoch mit Nachteilen verbunden – beispielsweise lässt sich auf diese Weise das mehrfache Laden von Texturen nicht verhindern. Wir benötigen daher eine zentrale Texturverwaltung – einen so genannten Texture-Manager – der für das Laden und die Freigabe aller Texturen verantwortlich ist. Soll eine Textur geladen werden, dann erhält die aufrufende Instanz (bsp. die CCursor-Klasse) lediglich einen Zeiger auf die angeforderte Textur-Ressource. Fordern gleich mehrere Instanzen eine bestimmte Textur an, so wird diese nur einmal geladen. Wird eine Textur nicht mehr benötigt, dann kann die betreffende Instanz die Textur-Ressource natürlich auch wieder freigeben. Tatsächlich gelöscht wird die Textur aber erst dann, wenn diese von keiner Instanz mehr verwendet wird.

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