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

Aktuelle Zeit: So Jul 20, 2025 09:21

Foren-Übersicht » Programmierung » OpenGL
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: Textur update
BeitragVerfasst: Mo Sep 12, 2005 19:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ich brauche eine methode um so schnell wie möglich eine Textur ändern zu können... :)

Also ich erstelle eine Textur via:

Code:
  1.     glGenTextures(1, @texture);
  2.     glBindTexture(GL_TEXTURE_2D, texture);
  3.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  4.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  5.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  6.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  7.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA8, Bitmap.Width, Bitmap.Height, GL_RGBA, GL_FLOAT, @RGBA[0]);


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???

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 12, 2005 20:12 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Ä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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 12, 2005 20:22 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Speedmaster hat geschrieben:
Äh, das würde mich auch interessieren wie man Texturen wieder entläd!

ehm... entladen einfach via glDeleteTextures... aber das war nicht meine frage...

Ich will nicht wissen wie man texturen löscht/entlädt.. sondern wie ich sie schnell/effizient update..

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 12, 2005 20:41 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 12, 2005 21:17 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

tausend dank.. war genau das was ich gesucht habe :)

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 29, 2005 19:06 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

hab doch noch ein Problem irgendwie...

also, ich habe 10 bilder in der auflösung 800x600... die speichere ich alle in einen 2D-Array..

Code:
  1. TColorValue = Record
  2.   R, G, B: Single;
  3. end;
  4.  
  5. TBitmapArray = Array of Array of TColorValue;
  6.  
  7. var
  8.   pics: Array[1..10] of TBitmapArray;

texture: Array of Array of GLUInt;

Zeichen tue ich die bilder in einer Orthogonalen Ansicht indem ich sie auf mehrere 256x256px große Texturen aufteile:


Code:
  1. var
  2.   ary: Array of TColorValue;
  3.   x, y: Integer;
  4.   xx, yy: Integer;
  5. begin
  6.   SetLength(ary, 256 * 256);
  7.   for x:=0 to Ceil(800 / 256) do begin
  8.     for y:=0 to Ceil(600 / 256) do begin
  9.       //... immer 256x256px der daten aus dem pics-Array in den localen ary schreiben.
  10.       if (texture[x, y] <> 0) then begin
  11.         glBindTexture(GL_TEXTURE_2D, texture[x, y]);
  12.         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, texSize, texSize, GL_RGBA, GL_FLOAT, @ary[0]);
  13.       end else begin
  14.         glGenTextures(1, @texture[x, y]);
  15.         glBindTexture(GL_TEXTURE_2D, texture[x, y]);
  16.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  17.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  18.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  19.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  20.         glTexImage2D(GL_TEXTURE_2D, 0, 4, texSize, texSize, 0, GL_RGBA, GL_FLOAT, @ary[0]);
  21.       end;
  22.       glBegin(GL_QUADS);
  23.         glTexCoord2f(0, 0); glVertex2f(x* 256, y* 256);
  24.         glTexCoord2f(1, 0); glVertex2f(x* 256+ 256, y* 256);
  25.         glTexCoord2f(1, 1); glVertex2f(x* 256+ 256, y* 256256);
  26.         glTexCoord2f(0, 1); glVertex2f(x* 256, y* 256+ 256);
  27.       glEnd;
  28.     end;
  29.   end;


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.Ä...

Hoffe mir kann irgendwer helfen...

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 29, 2005 22:00 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 29, 2005 22:06 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

mhh.. ja, werd mir das glPixelStore mal anschauen...

Aber es muß doch rein theoretisch schneller gehen...?? Ich meine wie funktioniert denn sonst Video wiedergabe via OpenGL/D3D???

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 29, 2005 22:36 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
http://oss.sgi.com/projects/ogl-sample/ ... object.txt

Damit sollte das schnell genug gehen. Beispiel Quelltext ist bei der Beschreibung.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 29, 2005 22:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

LarsMiddendorf hat geschrieben:
http://oss.sgi.com/projects/ogl-sample/registry/ARB/pixel_buffer_object.txt

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?? :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 30, 2005 07:51 
Offline
DGL Member
Benutzeravatar

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. :shock:
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 30, 2005 08:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Zu der pixel buffer extension hat Sascha auch mal ein Tutorial geschrieben:
http://www.delphigl.com/script/do_show. ... b&action=2

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 30, 2005 09:13 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 30, 2005 09:30 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 30, 2005 13:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

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. :shock:
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 ;)

Au'revoir,
Aya~


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 » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 3 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 16 Queries | GZIP : On ]