Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,
wie vlt einige von euch schon gesehen haben entwickel ich grad mein WormHoleSurfer weiter. Und um den Speicherverbrauch und die Rechenleistung zu senken will ich die doppelten Daten aus meinem VBO löschen. Bis jetzt hab ich die Daten einfach so wie ich sie auch zeichnen würde in das VBO beschrieben und dann mit glDrawArrays die Vertecs gezeichnet. Jetzt hab ich alle doppelten Vertecs im VBO entfernt und versuch mit glDrawElements die Vertecs zu zeichnen. Ich weiß aber nich genau wie ich glDrawElements benutzen muss, was genau muss in dem Array stehen?
Es gibt zwei Arrays. Im ersten Array (dem Array-Buffer) sind die Vertices. Im zweiten Array (dem Element-Buffer) sind die sogenannten Indizes. Dabei sind Indizes Verweise auf Vertices im Array-Buffer, genauer gesagt die Position im Array, also einfache Integer (meist 16 oder 32bit unsigned) Im Element-Buffer stehen diese Verweise in der gleichen Reihenfolge wie sie bei dir bisher im VBO waren. Nur du speicherst eben nicht den ganzen Vertex, sondern nur einen Verweis. Die Datenmenge lässt sich damit ungefähr auf ein Sechstel reduzieren, auch das Ergebnis des Vertexshaders kann gecacht werden. (näheres zu dieser Einsparung im Artikel Mesh)
Ein Beispiel gibt es sicher irgendwo im Wiki, ansonsten einfach nochmal fragen.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Aha, alles klar.... habs jetzt hin bekommen. Aber bei mir is es nur n 4tel weniger. Aber das 6tel is ja sicherlich bloß so der Durchschnittswert, oder?
Registriert: Sa Mär 14, 2009 17:48 Beiträge: 99
Programmiersprache: D, Java, C++
Bergmann89 hat geschrieben:
Aha, alles klar.... habs jetzt hin bekommen. Aber bei mir is es nur n 4tel weniger. Aber das 6tel is ja sicherlich bloß so der Durchschnittswert, oder?
Ich vermute das kommt darauf an, ob du Triangles oder Quads, oder ... nutzt, denn gehen wir mal von folgendem Mesh aus:
Der rot markierte Punkt läge ohne Indizes sogar 8 mal im VBO, mit Indizes nurnoch 1 mal und bei allen anderen Punkten kommen wir von 2 auf 1 mal.
Vorher: 8 * 3 = 24 Vertizes Nachher: 9 Vertizes
Da haben wir ordentlich eingespart, und wenn das ganze teil jetzt größer wäre würden wir die Reduzierung von 8 auf 1 Vertex viel häufiger haben und somit wäre der Gewinn umso größe.
Bei Quads fällt das natürlich kleiner aus, bestünde das Mesh aus 4 Quads würden wir in der Mitte "nur" von 4 auf 1 Vertex kommen.
Da ich vermute, dass du Quads im VBO hast ist dein Gewinn also nicht ganz so groß, allerdings kannst du ohne weiteren Platzbedarf im VBO aus den Quads Triangles machen .
Aber das 6tel is ja sicherlich bloß so der Durchschnittswert, oder?
Da dies das Einsteiger-Forum ist....kurze Antwort: ja, ein Durchschnittswert für "vernünftige", zusammenhängende Dreiecksmeshes mit einigen tausend Faces oder mehr.
lange Antwort: In einem geschlossenen und 2-mannigfaltigenDreiecksmesh mit vernachlässigbar kleinem Genus wird ein einzelner Vertex im Durchschnitt von ungefähr 6 Faces verwendet. Wenn der Genus 1 ist, sind es sogar genau 6 Faces im Durchschnitt. Wenn Vertices im Vergleich zu Indices also "groß" sind sparst du etwas weniger als 5/6 der Daten ein. (Die genannten Eigenschaften sind im Artikel Mesh ausführlich erklärt)
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.