OpenGL Tutorial (Version 3.3) – Meshverwaltung (Download)

Genau wie Texturen sollte man 3D-Meshes niemals dort initialisieren, wo sie benötigt werden, denn dieses Vorgehen ist einfach mit zu vielen Nachteilen verbunden – beispielsweise lässt sich auf diese Weise das mehrfache Laden eines Meshes nicht verhindern. Wir benötigen daher eine zentrale Meshverwaltung – einen so genannten Mesh-Manager – der für das Laden und die Freigabe aller Meshes verantwortlich ist.
Soll ein Mesh geladen werden, dann erhält die aufrufende Instanz (bsp. die CModel-Klasse) lediglich einen Zeiger auf die angeforderte Mesh-Ressource. Fordern gleich mehrere Instanzen ein bestimmtes Mesh an, so wird dieses nur einmal geladen. Wird ein Mesh nicht mehr benötigt, dann kann die betreffende Instanz die Mesh-Ressource natürlich auch wieder freigeben. Tatsächlich gelöscht wird das Mesh aber erst dann, wenn dieses von keiner Instanz mehr verwendet wird.
Zwei Strategien bieten sich an, um das mehrfache Laden eines Meshes zu verhindern. Zum einen kann man jedem Mesh eine eindeutige ResourceID zuweisen. Vor dem Ladevorgang wird dann zunächst überprüft, ob es bereits eine Mesh-Ressource mit der gleichen ID gibt. Man kann natürlich auch die Namen der geladenen Meshes speichern. Vor dem Laden eines neuen Meshes wird dann zunächst überprüft, ob es bereits eine Mesh-Ressource mit dem gleichen Namen gibt.
Unser Mesh-Manager wird beide Strategien unterstützen. Verschaffen wir uns mal eine Übersicht über die neuen Funktionen für die Meshverwaltung:

// Funktionen für die Meshverwaltung:

void Set_NumMeshesMax(long numMeshesMax);
void Delete_MeshManager(void);

long Get_NumOfUsedMeshes(void);
long Get_Unused_MeshResourceID(void);

void Release_Mesh(CMeshVB_IB** ppMesh, long ResourceID);
void Release_Mesh(CMeshVB_IB** ppMesh);

// Mehrfaches Laden eines Meshes wird verhindert durch Vergleich der
// zugehörigen ResourceID mit bereits verwendeten ResourceIDs
// (jedem Mesh muss vorab eine eindeutige ResourceID zugeordnet worden
// sein):

CMeshVB_IB* Load_Mesh(long ResourceID, char* szFileName, long numLODSteps);

// Mehrfaches Laden eines Meshes wird verhindert durch Vergleich des neuen
// Meshnamens mit bereits verwendeten Meshnamen:

CMeshVB_IB* Load_Mesh_And_Get_ResourceID(long* pResourceID,
            char* szFileName, long numLODSteps);




Hinweis:
Für die Ausführung dieses Programmbeispiels muss der Treiber Ihrer Grafikkarte die OpenGL Version 3.3 unterstützen.

Visual C++ 2010: DemoWithOpenGL2010_Tut20