OpenGL - Wie texturen verwalten?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

PhillipK

Betreff: OpenGL - Wie texturen verwalten?

BeitragSo, Jul 17, 2011 6:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Heyho Leute Smile

Mein VBO problem scheint gelöst zu sein, ich habe alles wie ich es benötige.
Falls jemand intresse hat, werde ich versuchen, ein Tutorial darüber zu verfassen.

Ich für meinen Teil widme mich jetzt dem nächsten problem - Texturen für meine Tri's.

Da ich darauf erpicht bin, möglichst viel FPS zu fahren, habe ich noch diverse verbesserungsvorschläge an mein eigenes Programm.
Gestern habe ich mich ein wenig mit Texturkoordinaten auseinandergesetzt und die Koordinaten angaben - so denke ich - verstanden.
Nun frage ich mich, wie ich meine Texturen als Grafiken ablege, um sie optimal zu nutzen.
Das problem zb was ich habe ist:
BlitzMax: [AUSKLAPPEN]
glBindTexture(GL_TEXTURE_2D, GLTextur)

braucht jedes mal ein wenig meiner Kostbaren CPU Very Happy
Ich weiß nicht, was im hintergrund steht. Sollte nur eine variable umgeschaltet werden, ergibt sich das problem.
Wird mehr gemacht, möchte ich das vermeiden.

Um das ganze zu vermeiden, möchte ich möglichst selten meine Textur wechseln.
Da liegt die vermutung nahe, alle Grafiken sinnvoll auf einer größeren Textur anzuordnen.
Allerdings ist eine weitere idee die ich umsetzen möchte, das ausnutzen der Wiederholfunktion von OGL textur-koordinaten. Gebe ich einen Koordinatendifferenz von > 1 an, so wird die Texutr wiederholt dargestellt.
Im moment teste ich mit Sektoren, die 64x64 Kacheln haben, welche jeweils etwa 16pixel groß sind.
Sollten nun eine oder mehrere Kacheln neben bzw übereinander liegen, so sollen ein paar Triangles aus meinem IBO geschmissen werden und die uv koordinaten entsprechend angepasst werden. So habe ich statt 30 kacheln mit der selben Textur (nebeneinanderliegend) am ende nurnoch 1 gestreckte kachel mit 30fach widerholter Textur auf der X achse (bzw in der U - koordinate).
In meiner vorstellung von meinem landschaftsmodell zeichne ich dadurch nurnoch gut und gerne die halben vertices.

Der sinn dahinter ist fraglich, mir geht es ums lernen. Und eine solche Technik lässt sich bestimmt noch einmal im Leben brauchen. Smile Das durchgehen und neubauen eines Arrays (und das maximal alle 200 frames schätze ich! - noch dazu im eingegrenzten rahmen, macht vllt 20 if abfragen pro kachelveränderung) braucht nicht die Welt an zeit.
Tja, nur wie baue ich jetzt meine Texturen zusammen?

-----

Zum oben genannten problem in meinem Vorstellungsrahmen habe ich mir 2 mögliche Wege ausgedacht:

Arrow Einlesen größerer Tile-sets und aufspalten der Pixmaps in entsprechend viele einzelkacheln.
Arrow Texturen nur untereinander speichern (bei einer Kachelgröße von 16x16 kacheln also zb eine Textur von 16x256 für 16 kacheln, die untereinander liegen)

Um maximale Flexibilität zu erreichen, fände ich persönlich den Pixmap-in-'frames'-aufteilen-weg besser.
Nur die frage, gibt es grenzen in OGL?
Draw2D verwöhnt einen. Ich weiß nicht, ob es ein maximum an geladenen Texturen gibt, noch ob es in mengen Extreme Geschwindigkeitsverluste Zeigt, wenn ich gute 500x die Textur wechsel, nur für die Landschaft.

Ich hoffe, ich konnte meine vorschläge ausreichend erklären und erhalte Kontruktive kritik. Vielleicht gibt es ja auch schon genau zu dieser Problematik ein Workarround mit einem ganz anderen ansatz? Ich freue mich jedenfalls auf antworten.

---

Edit 17.07.2011 - 08:12:

Mir ist grade aufgefallen, das mein vorhaben mit den zerteilten Pixmaps garnicht möglich zu sein scheint.
Grund hierfür ist, das ich momentan mehrere Arrays im RAM sowie in der Graka halte, welche meine Vertices, farben und UV-koords wiederspiegeln.
Das ganze wird als batzen per glDrawElements gezeichnet. Es dürfte also kaum möglich sein, jedem Triangle seine eigene Textur zuzweisen.
Nun bin ich vollkommen ratlos - was tue ich nun? Sad Gibt es einen trick oder ein state den ich setzen kann, um den bereich einer UV textur zu verringern?

Angenommen ich habe 2x2 tiles á 16x16 pixel.
Tile 1 hätte also U von 0.0 bis 0.5, V von 0.0 bis 0.5.
Kann ich ogl mitteilen, das ich diesen bereich öfters zeichnen möchte? Irgendwie? :/

Mit freundlichen grüßen, Phillipk
 

Matthias

BeitragSo, Jul 17, 2011 12:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay PhillipK

Ambesten ist es wenn du eine große Texture benutzt wo alle Tiles drauf sind

Dann machst du dir ein Sektor-Object mit 8x8 Quads und dieses als glGenLists
Jedes Quad (o. 2Triangles) bekommt seine 4 UV Koordienaten.

Das ist schnell und unkomplieziert.

http://wiki.delphigl.com/index.php/Hauptseite

http://wiki.delphigl.com/index.php/glGenLists

PS: Du kannst mich auch über ICQ anschreiben wenn nötig. Very Happy
 

shootermaker

Betreff: Re: OpenGL - Wie texturen verwalten?

BeitragSo, Jul 17, 2011 13:06
Antworten mit Zitat
Benutzer-Profile anzeigen
PhillipK hat Folgendes geschrieben:
Heyho Leute Smile

Mein VBO problem scheint gelöst zu sein, ich habe alles wie ich es benötige.
Falls jemand intresse hat, werde ich versuchen, ein Tutorial darüber zu verfassen.
...


Aber Hallo! Very Happy
Also so ein Tutorial wäre echt super, da ich genau an dem gleichen Problem stehe.
 

PhillipK

BeitragSo, Jul 17, 2011 13:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach was solls, aber erwartet keine meisterleistung Very Happy
Ich habe mittlerweile soviel ahnung von OpenGl wie ein toast. Ein bisschen aber ich werd nicht wirklich wissen, wovon ich rede Smile

Ich werd mich mal dran versuchen, mein erstes Tutorial zu schreiben Very Happy

ps:
Das wird allerdings ein wenig brauchen, ich habe noch nie ein Tutorial verfasst und war auch nicht immer der beste Schreiberling.
Wenn es fragen gibt, könnt ihr erstmal per Privatnachricht kontakt mit mir aufnehmen Smile
 

PhillipK

BeitragMo, Jul 18, 2011 6:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Matthias hat Folgendes geschrieben:
Hay PhillipK

Ambesten ist es wenn du eine große Texture benutzt wo alle Tiles drauf sind

Dann machst du dir ein Sektor-Object mit 8x8 Quads und dieses als glGenLists
Jedes Quad (o. 2Triangles) bekommt seine 4 UV Koordienaten.

Das ist schnell und unkomplieziert.

http://wiki.delphigl.com/index.php/Hauptseite

http://wiki.delphigl.com/index.php/glGenLists

PS: Du kannst mich auch über ICQ anschreiben wenn nötig. Very Happy


Heyho Matthias!
Mit großen Texturen habe ich meine bedenken.
Nach ein paar tests ist mir dennoch eine Methode eingefallen, die ich für mein vorhaben verwenden könnte. Leider impliziert diese, das ich jede Textur indirekt 2x laden muss.

Ich plane, meine IBO's dementsprechend anzupassen, das ich eins habe, wo die kacheln normal dargestellt werden und ein weiteres pro Textur, welches größere bereiche umspannt.
Zum einen würde ich dann eine "AtlasTextur" oder wie man sie nennt, nutzen, um mit dieser die verschiedenen Kacheln darzustellen und zum anderen jede Textur einzeln.
Sollte ich in meiner routine genügend große bereiche feststellen, welche Am ende 12 oder mehr Tri's einsparen würden, so würde ich die Textur der entsprechenden Pixmap entnehmen und als eigene Textur laden. Diese bereiche werden dann durch 2-4 Tri's dargestellt und mit einer entsprechend gekachelten, wiederholten textur gezeichnet.
Zumindest soweit die theorie Very Happy Ob ich das ganze so umsetze, ist allerdings noch fraglich.

Ich habe im netz eine Möglichkeit gefunden, den Texturindex direkt in die UV koordinaten mit einzutragen.
Hierzu lege ich einfach U,V, Index als Texture-coords-array an. Allerdings habe ich keine ahnung, was ich aktivieren muss, um die texturen auch laden zu lassne. Bisherige ergebnisse brachten allerdings keinen erfolg. Sad

Naja, muss ich eben dranbleiben. Irgendwann habe ich meine idee einer riesen Tilemap realisiert =D

Ps: Im worst case (jede kachel besteht aus 2 Tris, 4 verts, 8 uv und 12 color - werten) bin ich immerhin auf 250-300 fps (bei 3x3 sektoren á 64x64 Kacheln). Damit bin ich schon ganz zufrieden Smile
Alles weitere ist nur ein austesten der möglichkeiten.

Mfg, PhillipK

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group