In meiner Aktuellen Engine werd ich es so machen.
Direct3D erlaubt es einen Formatlosen VB zu erstellen. In diesen kannst du unabhängig vom Vertexformat, vertice speichern. Dann produzierst du einen Manager der einfach ein Array von Vertice annimmt. Dieser Manager verteilt dann das Array auf die einzelnen 64KB großen VertexBuffer die in einer einfachen Liste gespeichert werden. Als ergebnis bekommt man dann einen Satz Offsets geliefert die den Bereich angeben in dem sich das Modell befindet.
IndexBuffer speichert die Modellklasse selber. Weil diese sehr begrenzt sind und nicht alle Modelle einenen IndexBuffer haben müssen. Bei kleineren Modellen ist es eh überflüssig.
Was für Vertice man nun im Manager ablegt spielt keine Rolle. Ich werde das in einem VB Interface kapseln. so sieht es für den Benutzer aus als würde er für jedes Modell einen VertexBuffer erstellen. Intern geht alles über die Liste.
Nun Rendert man nicht mehr einzelne VertexBuffer sondern Bereiche die n VertexBuffer enthalten können. Der Vorteil liegt auf der Hand. Die change das viele VertexBuffer bereits im VRAM liegen ist größer als wenn man mehrere Große hat.
Wie gesagt so werd ich das machen. Da ich über ein VB Interface gehe werd ich aber auch die Möglichkeit offen lassen zu wählen. Entweder Manager oder Einzelner VB. Da es grad bei den Leveldaten um sehr große Datenmengen geht, kann es sich vorteilhafter auf die Performance auswircken wenn man nicht über den Manager geht.
Wie ist es denn mit den Level Daten. Nehmen wir an, ich habe 2 Räume mit einem Gang, der sie verbindet. Diese Level Daten werden dann in einen Vertexbuffer gepackt, oder auch auf mehrere aufgeteilt?
Ja das ist eine gute Frage. Die sich wohl jeder von uns gestelt hat oder noch stellen wird. Ein gutes Konzep hab ich dafür noch nicht. Bei einem Terrain habe ich es so gemacht das alle Vertice in einem VB liegen und die Leafs enthalten dann jeweils einen IB, die dann mit dem VB gerendert werden. Ideal ist das aber nicht da der VB sehr groß ist. Sollte er einmal verschoben werden müssen, kostet das viel Zeit.