Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 16, 2025 16:30

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: VBOs - Materials und Octree
BeitragVerfasst: Mo Mär 01, 2010 12:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Dez 03, 2008 12:01
Beiträge: 167
Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
Hi,
ich habe da eine Frage: Man soll ja VBOs zum rendern verwenden. Vor einiger Zeit schon hab ich das in meine 3D-Engine so eingebaut. Ich hab dann in meinem Map-format ein Material festgelegt (Textur, Shader usw.), pro Material gabs ein VBO. Soweit alles gut.
Jetzt hab ich mir allerdings gedacht, das es sinnvoll wäre, einen Octree zu verwenden (brauch ich zwar momentan noch nicht, sobald die Maps aber komplexer werden, wäre es sinnvoll). Mein Problem ist, das ich jetzt nicht weiß, wie ich meine Polygone ordnen soll. Einerseits wäre es ganz sinnvoll, alle Polygone in einem Octree-Block in ein VBO zu stecken, allerdings passt es dann wieder mit den Materialien nicht...

Wie kann ich das ganze also sinnvoll (und vor allem effizient) ordnen?

darkinsanity

_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: VBOs - Materials und Octree
BeitragVerfasst: Mo Mär 01, 2010 17:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ich würde deine Objekte in den Octtree einsortieren. Ein "Objekt" ist dann die Menge aller VBOs/Materialien die zu einem Objekt, sagen wir einem Gebäude, gehören.

Der Octtree sollte nur statische Objekte (Gebäude, Bäume, ...) enthalten, keine Objekte die sich in jedem Frame bewegen, wie beispielsweise der Spieler selbst.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: VBOs - Materials und Octree
BeitragVerfasst: Di Mär 02, 2010 11:11 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Dez 03, 2008 12:01
Beiträge: 167
Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
Danke,
das man nur statische Objekte insortieren sollte, ist logisch ;)
Aber geht so nicht ein Haufen Geschwindigkeit verloren, wenn ich dann wieder viele VBOs hab?

_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: VBOs - Materials und Octree
BeitragVerfasst: Di Mär 02, 2010 11:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
darkinsanity hat geschrieben:
Danke,
das man nur statische Objekte insortieren sollte, ist logisch ;)
Aber geht so nicht ein Haufen Geschwindigkeit verloren, wenn ich dann wieder viele VBOs hab?


Ich hab das bei mir so gelöst das ich z.B. Gebäude in einen VBO packe, und dann aber für jedes einzelne Objekt (mit eigenem Material) des Gebäudes via DrawRange etc zeichne.

So wird dann einmal nur der VBO gebunden, und dann halt stückchenhaft gezeichnet.

Bei meinem Octree habe ich mir zudem 2 möglichkeiten eingebaut die Scene zu zeichnen.
EInmal wird einfach zelle für zelle des Octress gezeichnet (also die objekte darin), und alternativ kann ich es umstellen auf ein "Sammel alle sichtbaren Objekte aus dem Octree, sortier sie nach material und zeichne sie dann erst" :)

Aya


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: VBOs - Materials und Octree
BeitragVerfasst: Di Mär 02, 2010 11:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Nun, da du die Teil-Objekt manchmal an komplett anderer Stelle rendern musst, z.B. bei einem Baum musst du zuerst den (soliden) Baumstamm und dann erst irgendwann später die transparenten Zweige rendern. Du musst den VBO also sowieso zwischendurch wechseln.

Letztlich kannst du aber auch einfach ALLES in einen großen VBO werfen und dann eben unter Nutzung des Offset-Parameters nur den gewünschten Teil rendern. Die Verwaltung wird dann aber kompliziert, wenn statische Objekte dazukommen oder entfernt werden. Ein Beispiel wären Trümmerteile die nach einer bestimmten Zeit verschwinden. Würde dann ein Loch im VBO geben. Ein weiterer Nachtteil ist das der VBO als ganzes im Speicher der Grafikkarte bleiben muss und bei Speichermangel nicht bzw. nur als ganzes in den Hauptspeicher ausgelagert werden kann.

Objekte innerhalb eines Blattes des Octtrees zusammenzufassen würde bedeuten, dass du für jedes Blatt mindestens einen VBO benötigst. Erstmal sind das exponentiell viele und zweitens, was macht du eigentlich, wenn sich ein Objekt über mehrere Blätter erstreckt? Üblicherweise hat man ja viele identische Objekte unregelmäßig in der Szene verteilt. Also lieber die identischen Objekte zusammenfassen als für jedes Blatt im Octtree einen eigenen Spezial-VBO generieren. Insbesondere, weil sicher nicht alle Objekt in einem Blatt die gleiche Textur/Material/Shader nutzen und sowieso einzeln gerendert werden müssen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: VBOs - Materials und Octree
BeitragVerfasst: Di Mär 02, 2010 12:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Coolcat hat geschrieben:
Nun, da du die Teil-Objekt manchmal an komplett anderer Stelle rendern musst, z.B. bei einem Baum musst du zuerst den (soliden) Baumstamm und dann erst irgendwann später die transparenten Zweige rendern. Du musst den VBO also sowieso zwischendurch wechseln.

Ja, aber wenn man ihn dann doch mehrfach binden muß macht es das ja auch nich schlimmer als wenn man von vornherein 2 hat.. :)

Bei mir schaut das halt so aus das wenn ich in Maya ne Scene baue, in Maya einfach (schon wegen der übersicht) z.B. Baumstamm und Blätter zu ner Gruppe zusammen packe. Wenn ich die Scene dann für meine Engine exportiere wird eben für die Gruppe "Baum" ein VBO (Mesh) angelegt. Jetzt wird für jedes einzel-objekt (Baumstamm, Blätterkrone) ein "Object" (Alles was dargestellt werden kann, ist bei mir von einem "Objekt" abgeleitet. In dem speziellen fall wäre es jetzt also ein CIPolyObject) angelegt.

Diese 2 Objekte haben eine referenz auf das Mesh, eine referenz auf ein Material, sowie ihren offset wert für's zeichnen.

Wenn ich jetzt 500 bäume zeichnen will (ohne hardware instanzing etc), würde ich halt 500x dieses PolyObjekt zeichnen. Für diese 500 Bäume würde meine Engine dann jetzt im moment ein einziges mal den VBO binden und dann ganz oft glDrawRange aufrufen.

Würde ich es von vornherein in 2 VBOs packen, müßte entweder ständig zwischen den VBOs gewechselt werden, oder die engine müßte wissen das es 500x den baumstamm und dann 500x die Baumkrone zeichen müßte.

Coolcat hat geschrieben:
Letztlich kannst du aber auch einfach ALLES in einen großen VBO werfen und dann eben unter Nutzung des Offset-Parameters nur den gewünschten Teil rendern. Die Verwaltung wird dann aber kompliziert, wenn statische Objekte dazukommen oder entfernt werden. Ein Beispiel wären Trümmerteile die nach einer bestimmten Zeit verschwinden. Würde dann ein Loch im VBO geben. Ein weiterer Nachtteil ist das der VBO als ganzes im Speicher der Grafikkarte bleiben muss und bei Speichermangel nicht bzw. nur als ganzes in den Hauptspeicher ausgelagert werden kann.


Einen großen VBO hatte ich anfangs mal ausprobiert. Das hat keinen geschwindigkeits vorteil gebracht.
Und der große nachteil ist eben das von dir angesprochene.

Coolcat hat geschrieben:
Objekte innerhalb eines Blattes des Octtrees zusammenzufassen würde bedeuten, dass du für jedes Blatt mindestens einen VBO benötigst. Erstmal sind das exponentiell viele und zweitens, was macht du eigentlich, wenn sich ein Objekt über mehrere Blätter erstreckt? Üblicherweise hat man ja viele identische Objekte unregelmäßig in der Szene verteilt. Also lieber die identischen Objekte zusammenfassen als für jedes Blatt im Octtree einen eigenen Spezial-VBO generieren. Insbesondere, weil sicher nicht alle Objekt in einem Blatt die gleiche Textur/Material/Shader nutzen und sowieso einzeln gerendert werden müssen.


Bei mir hat der Octree-leaf eine referenz auf ein PolyObjekt (bzw eigentlich nur auf dem seine Transform-Node). Wenn ein Objekt jetzt sich über 5 Leafs verteilt, dann hat jeder der 5 leafs eine referenz auf das PolyObjekt.

Am ende ruft auch jeder der 5 leafs einmal das PolyObjekt auf zum zeichnen, allerdings ist das PolyObjekt schlau genug das es weiß das es schon gezeichnet wurde und daher sich nicht noch 4 weiter male zeichnen muß ;)

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot] und 12 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 17 Queries | GZIP : On ]