ich versuche mich gerade an einem Labyrinthgenerator in dem man das erschaffende Labyrinth auch durchstreifen kann. Das ganze ist Feld-basierend wie früher die alten Crawler ("Dungeon Master" oder "Eye of Beholder") allerdings mit weichen Bewegungen also eher wie "Legend of Grimrock" oder "Might and Magic X". Das Labyrinth wird als 2D-Array erstellt, in jedem Feld steht dann ob es ein Gang, offener Raum, T-Kreuzung,... ist. Die 3D Elemente sind modular aufgebaut und bestehen aus 2 bis 6 Mesh-Teilen. Es gibt 7 Mesh-Teile. Später soll es mehrere Sätze solcher Mesh-Teile geben. Für mehr Abwechselung kann dann zufällig ein Satz ausgewählt werden. Derzeit zeichne ich für jedes Feld die Mesh-Teile mit glDrawArrays. Im Frustum sind etwas über 100 Felder macht also bis zu 700 glDrawArrays Aufrufe. Alle Mesh-Teile liegen zwar in einem VOB und haben auch nur einen Texturatlas so das die Wechselei dafür wegfällt aber ich frage mich ob es nicht besser ist aus dem 2D-Array ein 3D-Model zu erstellen, das in einem VOB schieben und mit einem Aufruf zeichnen zu lassen.
Des weiteren versuche ich die Mesh-Teile indiziert zu zeichnen mit glDrawRangeElements. Aber irgendwie schaffe ich es nicht Dreieck 7 bis 25 zeichnen zu lassen. da kommt immer nur Wirrwarr bei raus. Auch sind die Beschreibungen von glDrawRangeElements recht wirr. Vielleicht kann da ja auch jemand helfen.
Registriert: So Aug 08, 2010 08:37 Beiträge: 460
Programmiersprache: C / C++ / Lua
Klingt eher als willst du instancing machen.
Hau also alle Meshteile in ein VBO und ruf pro Meshteil einmal glDrawArraysInstanced auf. Die Positionen/Matrizen gibts du entweder als UBO oder Uniformarray fester laenge durch (falls legacy gl).
Indexed rendering ist bei sowas halt auch eher unnoetig. Falls du das doch unbedingt haben willst, musst du schon mehr code geben, damit man nachvollziehen kann, wo es kaputt ist. ^^
Aber bei so kleinen Groessen ist es halt auch unnoetig da zu optimieren - ich wuerde es einfach, wenn es funktioniert, erstmal so lassen. (bis du halt irgendwann in performance probleme tatsaechlich reinlaeufts) #prematureoptimization
_________________ offizieller DGL Compliance Beauftragter Never run a changing system! (oder so)
Indexed rendering ist bei sowas halt auch eher unnoetig.
Dies habe ich auch gedacht, aus diesem Grund habe ich glDrawArrays( empfohlen. Da es sich um ein eckiges Labyrinth handelt, macht es nach meiner Meinung keinen Sinn mit Indizien, besonders wen noch eine Beleuchtung ins Spiel kommen sollte, man will ja die Kanten des Labyrinths sehen.
Oder soll das Labyrinth als Drahtgitter dargestellt werden ?
Oder soll das Labyrinth als Drahtgitter dargestellt werden ?
Nein es hat eher etwas von einem alten Stollen oder Höhle.
Zitat:
Falls du das doch unbedingt haben willst, musst du schon mehr code geben, damit man nachvollziehen kann, wo es kaputt ist
Ich möchte z.B. die Indice 7 bis 12 im IBO darstellen aber es kommt immer ab Indice 0 bei glDrawRangeElements. Ich werde nicht daraus schlau wie ich die Parameter einstellen muß.
Zitat:
glDrawRangeElements(mode, start, end, count, type, indices); start Specifies the minimum array index contained in indices.
end Specifies the maximum array index contained in indices.
count Specifies the number of elements to be rendered.
indices Specifies a pointer to the location where the indices are stored.
Ich habe mit Start und End versucht den Bereich im IBO anzugeben der gezeichnet werden soll aber wozu dann Count und es hat auch nicht geklappt. Ich hatte auch den Indices pointer auf z.B. 7 gestellt ... aber es hat nicht geklappt. Ab Indice 0 da ist alles schön. Ansonsten werde ich mir mal Instancing ansehen.
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Zu glDrawRangeElements: Die Funktion verhält sich exakt wie glDrawElements. Der einzige Unterschied sind die zusätzlichen Parameter start und end. Damit gibst du NICHT den Bereich des IBO an, der gerendert werden soll. Du sagst OpenGL nur, dass alle Indizes im IBO, die du mit dem Funktionsaufruf renderst, einen Wert zwischen start und end haben. Das ermöglicht dem Treiber unter Umständen, etwas Cache-Optimierung zu betreiben.
garantieren, dass Vertices 0-1000 nicht aus dem VBO gelesen werden müssen (und auch Vertices 1004 bis unendlich nicht).
Edit: Wenn du nicht mit dem ersten Index im IBO starten willst, musst du einen entsprechenden Offset als letzten Parameter übergeben – egal, ob du nun glDrawRangeElements oder glDrawElements einsetzt.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Zuletzt geändert von glAwesome am So Dez 03, 2017 16:57, insgesamt 1-mal geändert.
Dann würde ich glDrawArrays( empfehlen und auf IBO zu verzichten. Ich denke kaum, das es ein grosse Ersparniss gibt, wen man IBO nimmt, besonders, wen noch Normale ins Spiel kommen.
Mitglieder in diesem Forum: 0 Mitglieder 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.