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

Aktuelle Zeit: Sa Jul 12, 2025 00:03

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Frage zu VBOs und Texturen
BeitragVerfasst: Mo Aug 07, 2006 11:10 
Offline
DGL Member

Registriert: Do Jun 29, 2006 14:28
Beiträge: 19
Hallo Leute,

irgendwie schaffe ich den Sprung zu den VBOs nicht. Mein Problem ist, dass ich eine große Reihe von QUADs habe, die aber je eine andere Textur haben.

Ich habe mich nach dem VBO-Tutorial gerichtet, bei dem aber auf das Problem mit Texturen nicht eingegangen wird.

Was ich mir überlegt habe, wäre statt
Code:
  1. glDrawArrays(GL_QUADS, 0, VBOSize);


Einfach eine For-Schleife mit
Code:
  1. xyTexture.bind;
  2. glDrawArrays(GL_QUADS, i, 1);


zu nehmen. Frage ist nur, ob das funktioniert und - wenn überhaupt - nicht die ganze Performance wieder zunichte macht. Weiß das jemand, oder kann mir sogar einen besseren Vorschlag nennen?

Achja, in die Schleife soll evtl. auch noch ein glColor3f rein, damit ich einige QUADs markieren kann (die Markierung betrifft nur wenige QUADs, von daher wäre es unperformant, das mit in das VBO zu schreiben, denke ich).


Hab dazu leider weder im Forum noch im Wiki etwas gefunden, schon für einen Link wäre ich sehr dankbar![/code]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 07, 2006 11:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Üblicherweise ist es auch so, dass die Daten in einem VBO nach Texturen sortiert werden. Aber wenn du für jede Textur ein einzelnen Quad hast, dann lohnt der Umweg über VBOs nicht mehr. Natürlich kannst du für jedes Quad einmal glDrawArray aufrufen. Sollte es sich dabei um 16 Quads handeln ist es von der Geschwindigkeit her egal. Handelt es sich dabei aber 1000+ dann solltest du dir etwas anderes überlegen. Aber in deinem Fall wäre das Handling mit VBOs wesentlich komplizierter als es eben per Hand aufzurufen. Außer wie gesagt es handelt sich dabei um 1000+ Flächen. Wenn die Texturen klein genug sind könntest du diese evtl in eine packen. Aber auch bei 20 Quads solltest du dir nicht zu viel davon erhoffen.

So gesehen hast du den großen Vorteil von VBOs nicht genutzt. Du zeichnest nicht alle Dreiecke am Stück sondern würdest jedes einzeln zeichnen. Das ist so eigentlich nicht angedacht gewesen. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 07, 2006 13:13 
Offline
DGL Member

Registriert: Do Jun 29, 2006 14:28
Beiträge: 19
Hrm, das Problem ist ja, dass VBOs nicht mit Texturen umgehen können. Das Ganze hab ich mal mit Displaylists probiert - brachte auch einen Geschwindigkeitsvorteil, aber zog eine Menge (= zu viel) Arbeitsspeicher.

Na gut, meine Darstellung da oben ist etwas vereinfacht. Ich habe (je nach Sichtweite) 12000 Quads und etwa 2000 Texturen. Macht das da auch schon Sinn?

Weil derzeit (und ich zeichne wirklich nur die Quads und versehe sie jeweils mit den Texturen, das ist im Prinzip alles, was ich da mache) habe ich lediglich eine Framerate von 40 FPS und das ist doch entschieden zu wenig...

Wie müsste ich denn vorgehen, wenn ich nach Texturen sortiere? Erstmal beim Start alle Quads (unabhängig von Sichtweite und aktueller Position) durchgehen und für jede Textur ein VBO nehmen? Wie kann ich denn dann nachher beim Rendern einschränken, dass nur QUADs innerhalb der Sichtweite angezeigt werden? (Sichtweite meint bei mir nicht direkt die Clipping-Distance, sondern wieviel ich tatsächlich rendere)


Danke für die großartige Hilfe hier! :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 07, 2006 13:21 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Wie groß sind denn die Texturen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 07, 2006 13:34 
Offline
DGL Member

Registriert: Do Jun 29, 2006 14:28
Beiträge: 19
Die sind 128x128!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 07, 2006 13:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja wenn du nach Texturen sortieren würdest müsstest du das so machen. Aber es quatsch für 6 Flächen ein VBO zu machen. Und selbst wenn alle Flächen in einem VBO wären wäre es nicht so performant, da du immer noch 2000 Aufrufe hättest.

Nicht schlecht. 128x128 x 2000 Stück. Das ist nicht wenig Speicher was du in beschlag nimmst. Musst du alle Texturen auf einmal zeichnen? Woher kommen die Texturen? Ich denke mal du solltest mal ein paar Infos springen lassen. Evtl sogar mit Bild so wie es aussieht. Ich möchte da jetzt ungern deine Bemühungen in eine falsche Richtung leiten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 07, 2006 14:09 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
du könntest natürlich viele deiner Texturen zu einem Tileset zusammenfassen (z.B. 4096*4096), dan bräuchtest du nur noch 2 echte Texturen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 07, 2006 14:14 
Offline
DGL Member

Registriert: Do Jun 29, 2006 14:28
Beiträge: 19
Argh, sorry. Hatte einen Fehler gemacht (Denk-/Mathematikfehler).

Hab mein Programm das nochmal nachrechnen lassen und es sind genau 378 Texturen. Lohnen sich die VBOs da also? Aber wie ist das nun mit der Sichtweitenbegrenzung..?

Die Texturen werden mittels deines Texture-Loaders eingebunden (mitteils der AssignFromBitmap-Prozedur - die Texturen selbst stammen aus einem extra-Dateiformat, aber das führt jetzt zu weit, ich speichere sie auf jeden Fall in ein TBitmap zwischen und übergebe sie dann an den Texture-Loader).

Einen Screenshot habe ich auch mal angehangen (die Grafiken sind nicht von mir, aber ich hoffe, dass ist hier zu Demonstrationszwecken noch okay, wenns ihrs gesehen habt, kann ich die Datei ja wieder löschen). Was man links und hinten so schwarz sieht, ist eben wo die "Sichtweite" zu Ende geht.

@The-Winner: Was ist als maximale Größe solch eines Tilesets zu empfehlen (damit auch Kompatibilität für etwas ältere Karten gegeben ist)?

EDIT: Hrm.. Anhängen macht Probleme ... ("Upload Error: Kann das Attachment ./files/heightmap_view_178.jpg nicht hochladen.")


Danke für die super schnellen Antworten hier. Man könnte fast meinen, ihr lebt in diesem Forum! :P


Zuletzt geändert von dagehterderPeter am Mo Aug 07, 2006 22:47, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 07, 2006 22:38 
Offline
DGL Member

Registriert: Do Jun 29, 2006 14:28
Beiträge: 19
Also, eine Textur von 4096*4096 ist nicht möglich (zumindest nicht mit lossys Texturenloader):

Zitat:
TglBitmap2D.GenTexture - The size for the texture is to large. It's may be not conform with the Hardware.


EDIT: Hab ihn das überprüfen lassen und bei 2048*2048 scheint Ende zu sein. Na gut, muss ich das Ganze eben Vierteln..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 08, 2006 08:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Der Grund warum das nicht geht ist der, dass ich von OpenGL abfrage wie groß die Texturen maximal sein dürfen und im Falle eines Fehler dann eine Exception auslöse. Also wie es dort der Fall ist.

Ich würde aber wenn dann eher zu 1024x1024 tendieren.

Aber sonst habe ich gerade kein klares Bild von deinem Projekt. Was auch an dem Kaffeemagel liegen kann. Also was es werden soll und wie die Texturen aussehen. Evtl gibt es ja etwas was man verändern könnte/sollte damit es mit VBOs besser klappt. Kannst du mir das Bild ansonsten mal per Mail zuschicken? Meine Adresse findest du auf der Teamseite.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 08, 2006 13:11 
Offline
DGL Member

Registriert: Do Jun 29, 2006 14:28
Beiträge: 19
Okay, moment.
EDIT: Darauf hätte ich auch eher kommen können - einfach [url]hier[/url] ansehen...

Im Prinzip ist es aber auch nichts anderes als ne Heightmap mit verschiedenen Texturen, um Landschaften darstellen zu können.

1024x1024 deshalb, weil das kompatibler ist? Denn - wenn möglich - würde ich ja eher zu einem größeren Tileset tendieren, weil die Anzahl der Texture.Bind-Aufrufe dadurch reduziert wird (die ja so lange dauern...)


Zuletzt geändert von dagehterderPeter am Sa Aug 12, 2006 11:50, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 08, 2006 13:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Weil ich nicht 100%tig davon ausgehen würde, dass alle Grafikkarten mit 2048x2048 umgehen können. In modernen Spielen finden man normal auch nur 512x512. Teilweise derzeit auch schon 1024x1024. Aber darüber bisher auch nicht.

Und das Bild offenbart mir das was ich fast befürchtet hatte. Ich denke du solltest es anders aufziehen. Für mich sieht es so aus als ob du 8 Grundtexturen hast und zwischen diese dann überblendest. Bzw diese Überblendungen auch als Texturen abgespeichert hast. Evtl solltest du das Blenden auch mit OpenGL machen. Oder irgendwelche anderen Möglichkeiten nutzen. Aber um ehrlich zu sein habe ich so etwas noch nicht gemacht. So spontan fällt mir daher auch keine wirklich sinnvolle Lösung für ein.

Evtl wäre es auch hilfreich mal zu erfahren was du im Endeffekt damit vor hast? Vielleicht hat da ja der ein oder andere auch noch eine Idee.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 08, 2006 15:23 
Offline
DGL Member

Registriert: Do Jun 29, 2006 14:28
Beiträge: 19
Naja, stimmt schon, dass diese Überblendungen als Texturen existieren.

Aber da das Ganze als kleiner Editor funktionieren soll (für ein Format, das ich beibehalten muss), lass ich das aus Kompatibilitätsgründen mal so - sonst wird's total kompliziert.

Aber keine Angst, das wird nicht produktiv genutzt oder so, ich will da nur ein bisschen dran lernen. :)


Irgendwelche anderen Vorschläge zur Verbesserung der Performance? Kommt mir doch arg wenig vor, so 13 FPS bei dieser Sichtweite...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 08, 2006 19:06 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na ja. Der Punkt warum es so langsam ist ist der, dass die VBOs nur so klein sind und du so häufig Texturen wechseln musst.

Was du evtl machen könntest wäre eine oder vier recht große Texturen die mehr oder weniger die aktuelle Textur im Ganzen ist. Eben nur kleiner. Aber noch so detailiert, dass man dort die Farben sinnvoll erkennen kann. Und die Struktur bringst du mit einer Detailtextur auf. Also eine Textur die kleiner ist und nur ein Muster enthält. So wird das zu mindest in Spielen immer gemacht. Damit hättest du eine größere Textur die aussehen würde wie ein Foto von Oben und eine Detailtextur die du zur selben Zeit auf die Map auftragen kannst. Multitexturing. Und dann könntest du mittels 4 VBO Zeichenoperationen deine Map zeichen. Das sollte noch recht gut aussehen und dürfte auch ein bisschen schneller sein. Allerdings weiß ich nicht ob das überhaupt ins Konzept passen würde.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 08, 2006 19:45 
Offline
DGL Member

Registriert: Do Jun 29, 2006 14:28
Beiträge: 19
Hrm.. Naja, ich möchte ja auch auf einzelnen Tiles noch die Texturen ändern können (Editor eben) - von daher wäre das glaube ich nicht so optimal.

Achja: NOCH verwende ich keine VBOs - da ich ja nicht sicher bin, wie ich das realisieren soll - derzeit läuft alles schön über FOR-Schleifen und glBegins und glEnds.

Aber trotzdem vielen Dank für eure Hilfe - ich werd mich mal weiter fortbilden und dann sehen, dass ich hier auch mal andern weiterhelfen kann. Nur muss man da hier ja ganz schön schnell sein. ;)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]