die daten in RGBA[] ändern sich jetzt ab und an.. im moment lösche ich einfach die komplette Textur und erstelle sie neu.. ist aber nich wirklich das effektivste ...
Gibt's da ne methode irgendwie die textur schneller zu laden...???
Und wenn ja (wovon ich einfach mal ausgehe *g*) darf die textur sich dann in höhe/breite ändern???
Äh, das würde mich auch interessieren wie man Texturen wieder entläd!
_________________ Shareholder und Leitender Entwickler bei Pipedream-Games.
Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Das Schnellste ist wohl mittels glTexSubImage einen Bereich der Textur updaten. Faktoren für die Geschwindigkeit wären da 32 Bit RGBA (o. BGRA), Keine MipMaps, Keine Kompression. Ob der Parameter GL_LINEAR_MIPMAP_LINEAR jetzt auch schon ein manko mit sich bringt kann ich nicht genau sagen. Musste am besten mal ausprobieren.
Wenn du die Größe / das Format ändern willst musst du glTexImage benutzen allerdings das auf eine bestehende Textur dauert länger als sie zu löschen und wieder neu zu erstellen.
gluBuild2DMipmaps ist so ziemlich das Langsamste was du benutzen kannst. Dann solltest du eher SGIS_generate_mipmaps (bzw. ab GL_VERSION_1_4 im Kern) verwenden. Das sollte man heutzutage primär sowieso benutzen.
So in etwa... also ich packe immer 256x256er blöcke aus dem pics-Array in einen localen 1D-Array. Dann schaue ich ob die Textur für die aktuelle position schon erstellt wurde.. Wenn nein, erstelle ich eine neue.. wenn ja kopiere ich die daten aus dem 1D-Array via glTexSubImage2D in die Textur.
Letzten endes zeichne ich dann noch ein Quad mit der Textur..
So, nur aus irgendeinem grund ist das noch immer nicht wirklich schnell... beim ersten mal lädt es relativ lange.. (klar, texturen werden erstellt).. aber dann bei den bildern 2-10 geht es auch nicht wirklich schnell... zwar mindestens doppelt oder dreifach so schnell wie bei dem ersten.. aber trotzdem noch zu langsam
Wie kann ich es schaffen die 10 Bilder wirklich flüssig hintereinander darzustellen...?? (ohne sie alle immer im GraKa arbeitsspeicher als Textur zu haben)..
Im grunde brauche ich dasselbe als würde ich ein Video via OpenGL darstellen.. nur das es bei mir lauter einzeldateien sind und kein AVI o.Ä...
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich denke du scheiterst an den Technischen Gegebenheiten. Es brauch nunmal Zeit um Texturdaten an die Graka zu schicken. Da du schon allozierten Speicher verwendest sparst du zwar etwas Zeit, aber das Übertragen an sich brauch immer noch genauso lange. Einzige Möglichkeit wären wenn du die Texturen packst. (Habe ich persönlich noch nie gemacht. Hier mal der Befehl: glPixelStore (glaub ich ) )
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Damit sollte das schnell genug gehen. Beispiel Quelltext ist bei der Beschreibung.
mhh... werd ich mir auf alle fälle auch mal anschauen.. aber hab eben direkt mal im ExtensionString geschaut... meine GeForce5 unterstüzt die Ext nicht... gibt es da nicht noch was anderes??
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Vor nicht alzu langer Zeit hat Finalspace ein ähnliches Problem und Hackbart auch. Und beide haben es hin bekommen. Also sollte das bei dir doch wohl auch möglich sein.
Zu PBOs würde ich Angesicht der oben genannten Thread auch nicht unbedingt greifen wollen. Speziell wenn man bedenkt, dass lediglich die neusten Grafikkarten das unterstützen.
Also ich bin seit gestern abend am Rätseln wie du es schafst überhaupt eine sinnvolle Textur darzustellen. Du gibst bei glTexImage an, dass du 4 Komponenten hast in deinem Record befinden sich aber lediglich 3. Ich gehe also mal davon aus, dass du die RecordAlign auf 8 gestellt hast und es somit ausnutzt, dass Delphi die Record in einem 8 Bytes Raster ausrichtet und nötigenfals vergrößert. Das ist nicht so praktisch. Falls das irgendwann mal durch eine Unit oder aus versehen verändert wird kracht es und du weißt nicht warum.
Als nächstes. Benutz bitte kein Array of array of array of record. Aus dem du dann noch deine Daten in ein array of Record kopieren musst. Wenn es auf Zeit ankommt, dann kannst DU es natürlich auch runterbremsen und das umständliche rauskopieren macht die Sache nicht besser. Erstell ein array of Pointer. Die Pointer erstellst du mit GetMem und füllst sie schon so wie sie sein sollen. Also so, dass du dir lediglich den Pointer schnappen musst und den direkt an OpenGL übergeben kannst. Damit dürfte das Laden im Vergleich zu den Arrays auch noch mal schneller gehen.
Wenn du die Möglichkeit hast, dann benutzt NPOT Texturen oder Texture_rectangle. Von texture_rectangle gibt es eine ARB, eine EXT und eine NV Variante. Alle samt gleich und EXT wird glaube ich vom Opengl Header noch nicht unterstützt. Dumm nur, dass ATI lediglich diese unterstützt. Aber da geringfügig den Header anzupassen ist sehr einfach. Wenn du das machst, dann würde ich ich mich mit einer Textur begnügen. Das reicht vollkommen aus. Texture_rectangle ist dafür alt genug um auch auf älteren System zu laufen. So musst du auch nicht ständig wechseln oder drauf achten wo du dich befindest.
Dann musst du mir aber auch mal bitte erklären warum du bei dem InternalFormat 4 als GL_RGBA angibst die Texturedaten aber als Float hochlädst. Wenn du FloatTexturen haben willst du das natürlich auch angeben. Anderenfalls muss OpenGL die Singles in Bytes umrechnen. Dann verschwendest du Bandbreite, weil die Pixel 4 Mal so groß sind, rechenleistung, weil es immer hin und her gerechnet werden muss, und qualitätiv bringt es auch nichts. Höchstens durch Rundungsfehler Abweichungen in den Farben. Ist aber unwahrscheinlich. Wenn du nicht unbedingt Floats benötigst würde ich diese auch ganz lassen.
Fasse ich noch mal zusammen.
- Texturdaten im Clientspeicher an EINEM Stück und genau so wie OpenGL sie haben will.
- NPOT oder Texture_Rectangle verwenden. Einfaches ändern einer Targetvariable reicht dabei vollkommen aus. Beim Zeichnen dann aber unterscheiden. Rectangle hat Pixelkoordinaten
Und das war es eigentlich auch schon. Dann sollte es gehen und entsprechend schnell sein.
PS: Wenn du das so weit hast würde ich mal testen ob es schneller ist, wenn du einen alphakanal mit überträgst oder ob die größere Datenmenge da schon wieder bremst. Habe selbst schon festgestellt, dass das in RGBA mitunter schneller ist als lediglich nur RGB.
PPS: Sollte das alles nicht klappen solltest du die Texturen komprimiert im Grafikkartenspeicher ablegen. Da du "nur" 10 Stück hast sollte das ja noch gehen. Oder nimm eine große vollständige Textur und lege in 4 Kleinen lediglich die Veränderungen zum vorherigen Bild ab. Oder Update lediglich die kleinen Stellen. Also Möglichkeiten gibt es so viele wie du experimentierfreudig bist.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Das war was anderes. Lars meint keinen PixelBuffer sondern ein PixelBufferObject. PixelBufferObject basiert auf VBOs und man sich einen Pointer zurückgeben lassen und dann direkt in die Textur streamen. Sind aber auf jeden Fall 2 unterschiedliche Dinge.
Registriert: Do Jun 19, 2003 10:44 Beiträge: 991 Wohnort: Karlsfeld (nahe München)
Lossy eX hat geschrieben:
Das war was anderes. Lars meint keinen PixelBuffer sondern ein PixelBufferObject. PixelBufferObject basiert auf VBOs und man sich einen Pointer zurückgeben lassen und dann direkt in die Textur streamen. Sind aber auf jeden Fall 2 unterschiedliche Dinge.
Ach so gut zu wissen.
_________________ Danke an alle, die mir (und anderen) geholfen haben. So weit... ...so gut
hab die zwei anderen Threads nochnicht gelesen, wollte aber mal kurz auf ein paar deiner "fragen" eingehen
Lossy eX hat geschrieben:
Also ich bin seit gestern abend am Rätseln wie du es schafst überhaupt eine sinnvolle Textur darzustellen. Du gibst bei glTexImage an, dass du 4 Komponenten hast in deinem Record befinden sich aber lediglich 3. Ich gehe also mal davon aus, dass du die RecordAlign auf 8 gestellt hast und es somit ausnutzt, dass Delphi die Record in einem 8 Bytes Raster ausrichtet und nötigenfals vergrößert. Das ist nicht so praktisch. Falls das irgendwann mal durch eine Unit oder aus versehen verändert wird kracht es und du weißt nicht warum.
Umh.. ja, das liegt daran das der Code beispiel nicht mein ganzer Code ist sondern nur auf das wesentliche begrenzt... und die Records etc hab ich nich via Copy/Paste gemacht sondern einfach so kurz neu getippt.. dabei hab ich den Alpha wert vergessen Also der record besteht aus R, G, B und A ^^
Lossy eX hat geschrieben:
Als nächstes. Benutz bitte kein Array of array of array of record. Aus dem du dann noch deine Daten in ein array of Record kopieren musst. Wenn es auf Zeit ankommt, dann kannst DU es natürlich auch runterbremsen und das umständliche rauskopieren macht die Sache nicht besser. Erstell ein array of Pointer. Die Pointer erstellst du mit GetMem und füllst sie schon so wie sie sein sollen. Also so, dass du dir lediglich den Pointer schnappen musst und den direkt an OpenGL übergeben kannst. Damit dürfte das Laden im Vergleich zu den Arrays auch noch mal schneller gehen.
Mhh.. ja ist eigentlich richtig... das es im moment ein Array of Array ist liegt daran das es von anderen erweiterbar sein muß.. und ein user soll im Array nicht umrechnen müßen welches feld da jetzt welches pixel ist.. Aber da werd ich das ganze dann einfach ein wenig anders lösen...
Lossy eX hat geschrieben:
Dann musst du mir aber auch mal bitte erklären warum du bei dem InternalFormat 4 als GL_RGBA angibst die Texturedaten aber als Float hochlädst. Wenn du FloatTexturen haben willst du das natürlich auch angeben. Anderenfalls muss OpenGL die Singles in Bytes umrechnen. Dann verschwendest du Bandbreite, weil die Pixel 4 Mal so groß sind, rechenleistung, weil es immer hin und her gerechnet werden muss, und qualitätiv bringt es auch nichts. Höchstens durch Rundungsfehler Abweichungen in den Farben. Ist aber unwahrscheinlich. Wenn du nicht unbedingt Floats benötigst würde ich diese auch ganz lassen.
Oh.. das wusste ich nicht.. danke Dachte es würde ausreichen wenn ich einfach GL_FLOAT als typ übergebe.
Lossy eX hat geschrieben:
PPS: Sollte das alles nicht klappen solltest du die Texturen komprimiert im Grafikkartenspeicher ablegen. Da du "nur" 10 Stück hast sollte das ja noch gehen. Oder nimm eine große vollständige Textur und lege in 4 Kleinen lediglich die Veränderungen zum vorherigen Bild ab. Oder Update lediglich die kleinen Stellen. Also Möglichkeiten gibt es so viele wie du experimentierfreudig bist.
Das mit den 10 Stück war nur beispiel.. kann eine beliebige anzahl an texturen sein
Werd mir jetzt alles mal anschauen, viel ausprobieren und mich dann wieder melden ob's geklappt hat
Mitglieder in diesem Forum: 0 Mitglieder und 6 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.