Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.08.2013, 18:47

[OpenGl] Probleme mit Multitexturing & VBO

Moin moin zusammen,
also ich habe folgendes Problem:
Ich arbeite im Moment an einem kleinen Map Editor in Python + OpenGl.
Aus einer .png Datei lese ich die Höhenkoordinaten aus den r,g,b-Werten aus. Die dazugehörige Textur speicher ich im Alpha Channel, somit stehen mir 256 verschd. Texturen zur Verfügung.

Anfangs hab ich mein Terrain im "immediate mode" gerendert und die Textur-Übergänge mit Multitexturing gut hinbekommen, wie man schnell merkt funktioniert das nicht bei größeren Maps.

Jetzt habe ich folgendes Problem, nachdem ich meine Map über ein VBO (ein einziges für die ganzen Daten, später mach ich das über einen Quadtree mit kleineren VBO's) rendere kann ich keine verschiedenen Texturen mehr benutzen.

Wenn ich das richtig sehe könnte ich jetzt mit glDrawArrays() jeweils nur 1 Quad rendern, und müsste dannach neue Texturen binden.

Was mir als Lösung aber ganz und gar nicht gefällt^^
Es gibt doch da bestimmt eine bessere/schnellere Lösung

Deswegen meine Frage, gibt es irgendeine Möglichkeit wie ich in ein VBO die Texture-ID jedes Vertices hinterlegen kann, dass das automatisch auf der Grafikkarte gebindet wird?
Oder macht man sowas über Shader? (mit Shadern hab ich mich noch nicht beschäftigt)

Lg pwnc4ke

€dit: Achja Displaylisten kommen auch nicht in Frage da sie statisch sind.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »pwnc4ke« (02.08.2013, 19:26)


Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

03.08.2013, 13:40

Du könntest Texturatlanten oder Texturearrays benutzen.
Es soll wohl ein paar neuere Extensions geben, die dann noch genau das ermöglichen, was du eigentlich willst.
Zb. GL_NV_bindless_texture
Habe ich aber noch nie damit gearbeitet und kann deshalb nichts dazu sagen.
Aber von deren Existenz darf man nichtmal auf neuerer Hardware ausgehen.
Die ersten beiden Stichwörter sollten für dich sinnvoller sein.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (03.08.2013, 13:46)


DarioFrodo

Treue Seele

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

3

03.08.2013, 20:16

Was ist, wenn du mehrere VBO erzeugst?
Dann kannst du die zu rendernden Quads nach Texturen sortieren, so das du jede Textur nur einmal binden musst.
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann

Man verkauft die Erde nicht, auf der die Menschen wandeln.

- Indianerweisheiten

Ich bin auch ein einhornimmond ;)

4

03.08.2013, 22:29

@SpieleProgrammierer
Danke für die Tipps werde mir das mal genauer ansehn. ( Das wird ja was, kenne mich eh noch nicht soo gut in der 3D Programmierung aus^^)

@DarioFrodo
Daran hatte ich auch schon gedacht, allerdings ist das Problem an der Sache, dass die Implementierung eines Quadtrees dann sehr schwierig wird.
Wenn ich z.B. die Vertice-Anzahl verringere, weil der "Bildschirm-Fehler" nicht so groß ist (bzw. die Pixel den Fehler nicht anzeigen), also wenn ich anstatt 9 kleinen Dreiecken ein großes zeichnet, stellt sich die Frage, wie ich das dann mit den Texturen mache.
Da müsste ich ja dann auch aus den 9 kleinen Texturen eine große machen, denke ich ^^
Da rendere ich lieber viele Dreiecke auf der GPU anstatt, dass ich große speicherhungrige Texturen erzeuge und die CPU durch einen komplizierten Quadtree lahmlege.
Versteht man, was ich in den letzten Sätze meine?^^

Oder man könnte die Dreiecke nur so weit vereinfachen, solange sie die selbe Textur haben, allerdings rendere ich dann an den Textur Übergängen deutlich mehr Dreiecke, welche das Game verlangsamen.
Bei vielen Textur Übergängen zieht dass die Performance runter.
Wenn man bedenkt, dass Python eh nicht so schnell ist, sollte wenigstens der Code schnell sein ;)

Also nochmal an alle, die Frage lautet: Wie rendere ich ein großes Terrain mit verschd. Texturen schnell, sodass ich es noch bearbeiten kann? :)

Für weitere Ideen bin ich dankbar :P

Werbeanzeige