Hallo,
ich habe mir gestern mal VBOs angesehen, weil ich unlängst in meinen Modelloader Displaylisten implementiert habe und die sich mit einer gescheiten LOD-Implementierung kaum vereinbaren lassen, wollte ich nun auf VBOs umsteigen.
Das Tutorial und die Wikiartikel über die Extension hab ich gelesen, aber ich habe offene Fragen. Im Tutorial wird das ganze folgendermaßen gerendert:
Offenbar müssen ja die Vertices, die gerendert werden sollen, genau in der Renderreihenfolge im Speicher liegen, sonst kann das ja nicht funktionieren. Wenn ich aber mein 3DModell so strukturiert habe (analog zum Dateiaufbau des restless-Formats), dass die Faces Referenzen auf die Vertices speichern und so die Vertices vollkommen willkürlich im Array liegen, gibt es dann auch eine Möglichkeit, das ganze elegant in den Grafikspeicher zu bringen?
oder ist die einzige Möglichkeit wirklihc, dass ich eine Buffer allokiere und alle Faces und deren Referenzen durchlaufe, um alle Vertices in genau der Reihenfolge, wie sie von den Faces referenziert werden, in den Speicher zu packen und dann zu rendern?
Wie sieht es dann noch mit dem Zugriff auf die Vertices aus? Ich lade ja mein Modell normal in den Hauptspeicher in eine Klasse, die Arrays für die Faces und die Vertices(mit Normalen und UV Koords) beinhaltet. Wenn ich die Vertices dann nochmal in den Grafikspeicher schreibe, gibt es auch eine Möglcihkeit, diese wieder von dort auszulesen? Mit anderen Worten: kann ich mir eine Speicherhaltung sparen und mein Model komplett im Grafikspeicher halten als VBO?
Mir ist die Struktur und die Herangehensweise der VBOs noch nicht ganz klar, vllt bin ich auch vollkommen auf dem flaschen Dampfer..
Danke schonmal
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ja, du kannst ein VBO (ähnlich wie Texturen) auch wieder zurücklesen, mit glGetBufferSubData.
Wenn du nur kleine Änderungen hast lohnt es sich, diese mit glBufferSubData zu schreiben, das ist schneller, weil es nicht synchronisieren muss.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mhh okay also müsste es prinzipiell gehen. Ich habe mal, bevor ich jetz die ganze Datenstruktur des Modells über den Haufen werf, eine Prototyp versucht, der die momentane Struktur in ein VBO schiebt:
raus kommt dabei allerdings nix
ich hab mich bei der implementierung an die NeheTuts zu VBO gehalten, aber da das ganze noch etwas kryptisch für mich ist, weiss ich nicht, wo der Fehler ist. ZB sagt die DGL Wiki dass der letzte Parameter von glVertexPointer der Zeiger auf das Array sein muss, also entweder auf meinen tmpBuffer (was ich nicht glaube, denn der diente ja nur dem Schreiben der Daten in den Grafikkartenspeicher) oder (das glaub ich eher) auf den GL-Namen des VBO. Allerdings funktioniert das genausowenig, alles bleibt schwarz ^^
Fehler kommen auch keine[/code]
Wenn ich aber mein 3DModell so strukturiert habe (analog zum Dateiaufbau des restless-Formats), dass die Faces Referenzen auf die Vertices speichern und so die Vertices vollkommen willkürlich im Array liegen, gibt es dann auch eine Möglichkeit, das ganze elegant in den Grafikspeicher zu bringen?
Ähm, es gibt nicht nur GL_ARRAY_BUFFER sondern auch GL_ELEMENT_ARRAY_BUFFER. Im "ARRAY"-Buffer sind die Vertices, im "ELEMENTS"-Buffer die Referenzen, auch Indizes genannt. Ich denke das ist es was du gesucht hast
Zitat:
ZB sagt die DGL Wiki dass der letzte Parameter von glVertexPointer der Zeiger auf das Array sein muss, also entweder auf meinen tmpBuffer (was ich nicht glaube, denn der diente ja nur dem Schreiben der Daten in den Grafikkartenspeicher) oder (das glaub ich eher) auf den GL-Namen des VBO
Der Pointer muss einfach 0 sein, dann wird der VBO genommen der mit glBindBuffer gebunden wurde. Der Pointer wird nur benötigt wenn du ein Array direkt rendern willst, also ohne Umweg über ein VBO. Hier mal ein Beispiel aus meinem Code:
Wie sieht es dann noch mit dem Zugriff auf die Vertices aus?
Ja, man kann die Daten wieder zurücklesen, wie Lord Horazont schon sagte. Allerdings befinden sich die Daten im Speicher der Grafikkarte, entsprechend langsam ist der Zugriff von der CPU aus. Wenn du die Daten also ständig benötigst, halte lieber eine Kopie im Hauptspeicher.
P.S. Die NeheTuts sind meiner Meinung nach Müll. Besser als nichts, aber das DelphiGL Wiki ist sicherlich viel besser
Okay das Elementsarray hatte ich mir schon angesehen, allerdings muss ich da ja auch meine ganzen Faces erst in ein Array Stopfen. Das ist prinzipiell ja aber nicht so problematisch, weil da die Reihenfolge entgegen den eigentlichen Vertices egal ist.
Ich hab das mal umgesetzt:
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.