Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

19.04.2004, 20:57

Allgemeine Frage bezüglich Vertexbuffer/Modeldaten

Hallo,

ich habe eine sehr allgemein gehaltete Frage bezüglich des Vertex - sowie Indexbuffers und der Speicherung von Model bzw. Level Daten in einem Spiel bzw. einer Engine.

Ist es so, dass in einem Vertex und Indexbuffer viele verschiedene Modelle gespeichert werden? Wenn dies so ist, und man benötigt nicht für jedes Model bzw. Objekt in einem Level einen extra Vertex und Indexbuffer, wie hält man dann - allgemein und programmiertechnisch gesehen - diese Objekte auseinander?

Es ist ja so, dass verschiedene Modelle auch versch. Texturen haben, möglicherwiese hat sogar ein Modell mehrere Texturen. Wenn nun auch noch verschiedene Modelle im Vertexbuffer stehen, wie stellt man da eine Beziehung her? Die Texturschicht müsste ja jedesmal geändert werden, wenn ein anderen Model aus dem buffer "an der Reihe" ist.

Ich bin z.Z. etwas verwirrt - meine eigene Engine ist nun an einen Status gelangt, an dem es einen Vertex und Indexbuffer gibt. Ich schreibe an einer Klasse, welche (3D Max) .ase Dateien für Models direkt lesen kann. Was ist jedoch, wenn ich mehrere Models lese - alle Daten in ein und denselben Vertex bzw. Indexbuffer? Wie halte ich sie dann auseinander, wie verbinde ich mit diesen Vertexdaten Texturinformationen oder ganz abstrakt: jegliche Art von Informationen, wie z.B. die aktuelle Position eines Models in einer 3D Welt?

Ich würde mich sehr freuen - auch wenn die Frage möglicherweise nicht sehr konkret gestellt wurde - wenn ihr mir da eine Antwort in Form eines Engine-Design Tipps geben könntet.

Falls Fragen bezüglich meiner Frage aufkommen, dann versuche ich gerne, diese noch besser zu beschreiben.


Vielen Dank!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

19.04.2004, 22:41

hi

in vertex bzw. indexbuffern werden wie der name schon sagt vertices bzw. indices gespeichert. mehr nicht
es ist natürlich möglich mehrere modelle in einem vertex und index buffer zu speichern. über die entsprechenden offsets kannst du die auch auseinanderhalten ( von 0 bis 250 is das erste modell, 251 bis. 1056 das zweite, ... ).
ich persönlich hab für jedes modell einen eigenen vertex und indexbuffer.

Anonymous

unregistriert

3

19.04.2004, 23:05

Naja sowas macht nur Sinn(also mehrer modells zusammen), wenn man aus mehreren modells eins machen will. Nehmen wir z.B. eine Tür, dann könnte es 3 verschiedene klinken,5 schlößer und 10 Bänder geben. Da diese Tür sich immer als Einheit(abgesehen von verformungen usw.) verhält, könnte man daraus ein Modell machen.
Bei den Texturen sollte man auch zusehen das man möglichst eine große hat(also schöne algos schreiben ;D ). Und zu der Verbindung der Infos: Man hat eine Klasse/Struktur in der einmal ein vertex, ein index ,die Texturzeiger und alle anderen Angaben drinne sind. Also du verbindest die Buffer nicht mit den infos, es sind infos.

Anonymous

unregistriert

4

20.04.2004, 01:07

Ah ok - also ist es "Gang und Gebe" mehrere, wahrscheinlich sogar sehr viele Index und Vertexbuffer zu benutzen, ist das richtig?

Dann ist es ja kein Problem - ihr könnt Euch meine Verwirrung sicher vorstellen, denn bisher habe ich immer an nur einen einzigen Vertexbuffer gedacht.

Nun könnte man ja eine Klasse für einen Gegner machen - diese Klasse beinhaltet einen Zeiger auf den Vertexbuffer für die Informationen des Models, so hätte ich meine "Verbindung" zwischen den Informationen. Ist das so richtig angedacht?

Anonymous

unregistriert

5

20.04.2004, 13:54

Ja und um die vertecies noch richtig zu verbinden brauchst und noch nen Index Buffer. Natürlich kann man sehr viel Speicher sparen, wenn man zum Beispiel für 10 Gegener die gleich aussehen die selben Buffer benutzt.
Und noch etwas: du speicherst ja nur die Punkte die später verbunden werden sollen in den Vertexbuffer, denn anderen Kram musst du dann in der Klasse speichern.

6

20.04.2004, 15:59

Es ist sehr Sinnvoll einen Buffer Manager und einen Textur Manager zu schreiben der die Daten verwaltet. Damit sparst du sehr viel Speicher, da keine Redundanten Daten mehr vorliegen.
Das gleiche kannst du auch für die kompletten Modelle machen. Die meisten Modelldaten eines Modells sind immer gleich. Unterschiede gibt es nur wenn man daraus z.B. einen Character macht. Diese haben Unterschiedliche Positionen und Gegenstände in den Händen und andere Animationsinformationen.
Es ist also Sinnvoll zwischen einem Modell und z.B. einem Character oder Spielobjekt (wie z.B. eine einfache Kiste) zu Unterscheiden. Damit kannst du dann noch einmal Speicher sparen.

Irgendwo in diesem Forum gab es schon einmal eine Diskusion über die Verwaltung von Vertex Buffern. Dabei kamm der Vorschlag eine Liste von Vertexbuffern aufzubauen die n Byte Groß sind (z.B. 64KB). Dies kann sich als sehr vorteilhaft erweisen.
Was nicht sehr gut ist wenn man viele Modelle in einem großen VertexBuffer hat. Weil ein Buffer immer komplette hin und her geschoben wird. Wenn der Buffer dann ein paar Megabyte groß ist, wirckt sich das sehr negativ auf die Performance aus. Zudem ist die Möglichkeit größer das er im Hauptspeicher liegt und nicht im VRAM.
Da haben die VB Listen ihren vorzug. Da sie eher klein sind, finden sie eher eine Lücke im VRAM und um Platz im VRAM zu schaffen muss man auch immer nur kleine häpchen verschieben.

Von der Handhabung her ist es am einfachsten für jedes Modell einen VB zu erzeugen. Was aber gar nicht geht ist das man in einem IB meherere Modell speichert. Schon bei der Darstellung meines Terrains bin ich durch den IB begrenz. Da die Hardware nur n Indices erlaubt.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

7

20.04.2004, 18:31

Vielen Dank, die Antworten haben mir schon sehr weiter geholfen.

Stellt sich nur noch die Frage des Konzeptes für mich - erstelle ich nun eine Model Klasse, die Models laden kann und einen entspr. Vertex und Indexbuffer kreeiert?

Oder Baue ich eine Buffer Klasse bzw. einen Buffer Manager, der dann alle möglichen Arten von Buffern verwaltet? Oder soll der Buffer Manager nur Vertexbuffer und Indexbuffer verwalten?

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?

Welche Klasse sollte denn einen entspr. Vertex und Indexbuffer erstellen?

Oh je, so viele Fragen... ich wäre für jeden weiteren Tipp dankbar :)

8

20.04.2004, 18:53

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.

Zitat

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.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Samuel G.

Treue Seele

Beiträge: 110

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

9

20.04.2004, 19:05

Ne Möglichkeit, VB/IB zu verwalten

Also bei mir ist es so:

Ich habe ne Model-Klasse, welche u. a. Zeiger auf die Vertex und IndexBuffers (also die Modelldaten) hat. Der Konstruktor erwartet u.a. gültige Zeiger auf nen VB und IB.

(Ich schreib ab jetzt VB/IB für VertexBuffer/IndexBuffer)

Wenn man also jetzt ein Modell erzeugen will, guckt man erst im VB/IB-Manager nach, ob die Modelldaten (z. B. für ein klitzegleiches Modell) schon geladen wurden. Wenn ja erzeugt man die Modell-Klasse mit ebendiesem schon geladenen VB/IB. Wenn nicht lädt man die Daten neu, registriert sie beim VB/IB-Manager und übergibt sie dem Konstruktor der Modellklasse als Parameter.

Vielleicht hilft dir das weiter. Mich würde interessieren, ob du (oder irgendjemand) ne bessere Methode kennt...


Samuel G.
Quak

Anonymous

unregistriert

10

20.04.2004, 19:06

Also hier fängt es mit den unterschiedlichen Konzepten an. Wenn man zu Bleistift nen Spiel progen will in dem die Gegenstände sich verändern, wenn man auf sie einwirkt( drauf kloppen oder Feuer darunter machen) und dadurch eine welt entsteht wo es im prinzip zwar 100 mal ne Kiste gibt, aber keine wirklich der anderen gleicht sollte man für jedes Modell meiner Meinung nach einen eigenen Buffer haben. Wenn das Programm aber 100 wirklich die selbe Kiste hat sollte man nen Manager progen der verhindert das 100 mal das gleiche in dem Buffer steht.
Fazit: ich würde zu der Manager Methode raten es sein denn du willst nen Spiel progen wo es tausend verschiedene Sachen gibt(Baukastenprinzip).
Zu den Level: Also da kommte es wirklich drauf an wie groß diese Räume sind. Halflife z.B. hat ja mehrere Areale und ich bin mir ziemlich sicher, dass jedes Areal mit nur Buffer aus kommt. Aber auch hier gilt: Jetzt ist's vorbei mit der Lernerei, also Kopf selber anstrengen, vielleicht kommt man ja auf eine wirklich geniale Idee. :huhu:

Werbeanzeige