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

Aktuelle Zeit: Do Jul 17, 2025 15:25

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Jul 07, 2007 00:09 
Offline
DGL Member

Registriert: Do Jul 05, 2007 00:45
Beiträge: 16
Ich verwalte meine Texturen in einem Array (Texture: array[0..4] of TGLBmp) nun möchte ich zur Laufzeit eine TExtur tauschen. dies tue ich mit folgendem Code:

Code:
  1. procedure TFormMatrix.LoadTextures2(TexturName: string);
  2. begin
  3.   Texture[0]:= TGLBmp.Create;
  4.   Texture[0].LoadImage(TexturName);
  5.   Texture[0].GenTexture(False,False);
  6. end;


Dadurch, dass ich mit TGLBmp.Create immer neuen Speicher reserviere, steigt der Speicherverbrauch aber stetig. Was währe der richtige Weg?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 07, 2007 00:14 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Vorher Texture[0].Free aufrufen.


Zuletzt geändert von LarsMiddendorf am Sa Jul 07, 2007 00:30, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 07, 2007 00:26 
Offline
DGL Member

Registriert: Do Jul 05, 2007 00:45
Beiträge: 16
das habe ich versucht:

Code:
  1.  
  2. procedure TFormMatrix.LoadTextures2(TexturName: string);
  3. begin
  4.   Texture[0].free;
  5.   Texture[0]:= TGLBmp.Create;
  6.   Texture[0].LoadImage(TexturName);
  7.   Texture[0].GenTexture(False,False);
  8. end;


Leider werden dann nicht mehr alle Texturen nach dem laden angezeigt.
Ohne das "Free" existiert dieses Anzeigeproblem nicht.[/code]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 07, 2007 00:44 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Warum willst du überhaupt zur Laufzeit eine Texture tauschen? Ist hier vielleicht etwas anderes gemeint ?
GLBmp Texturen werden mit der Methode Bind aktiviert, die dann glBindTexture von OpenGL aufruft. Um mit einer anderen Texture zu rendern, ist es nicht nötig sie neu zu laden, sondern sie muss nur neu gebunden werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 07, 2007 00:54 
Offline
DGL Member

Registriert: Do Jul 05, 2007 00:45
Beiträge: 16
Der Nutzer soll eigene Texturen verwenden können. Also gibt es in Texturverzeichnis und ich muss die Texturen in meinem Array tauschen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 07, 2007 02:07 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Wieso erzeugst du das Objekt nochmal neu?
Sollte Texture[0]:= TGLBmp.Create; nicht unnötig sein? Du hast ja schon ein Objekt dieses Typens.
Du müsstest dann nur per LoadImage und GenTexture die Textur neuerzeugen. Wobei ich an der Stelle nicht weiss inwiefern die Textur in OpenGL freigeben werden. Den diese belegen auch Speicher.

Übrigens sehe ich auch bei deiner Anwendung keinen Grund für "on-the-fly"-Wechsel. Du kannst ja dann das Texturenarray gleich mit den "User"-Texturen belegen.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 07, 2007 09:38 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Was auch noch unklar ist, warum immer Textures[0] und nicht Textures[0] bis Textures[3] verwendet werden. Dadurch existiert nach viermaligem Aufruf von LoadTexture nur noch die letzte Texture. Die ersten drei sind jeweils immer beim nächsten Aufruf gelöscht worden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 16, 2007 01:33 
Offline
DGL Member

Registriert: Do Jul 05, 2007 00:45
Beiträge: 16
- Ich kann die Texturen NICHT beim Start laden, denn ich kenne diese ja noch nicht.
- Mit folgendem Code habe ich Probleme bei der Anzeige von einigen Texturen:
Code:
  1.  
  2. //------------------------------------------------------------------------------
  3. // Texturen laden 2
  4. procedure TFormMatrix.LoadTextures2(TexturName: string);
  5. begin
  6.   //Texture[0]:= TGLBmp.Create;
  7.   Texture[0].LoadImage(TexturName);
  8.   Texture[0].GenTexture(False,False);
  9. end;
  10.  


Ich finde das Problem leider nicht. Die Texturen werden DANN nicht alle angezeigt.
MIT dem "Create" habe ich das Problem nicht!?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 16, 2007 06:09 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Wird denn Texture[0] beim erstenmal mit einer Objekt gefüllt? So wie das jetzt aussieht, hat Du kein Texturobjekt und müßtes eigentlich eine Exception bekommen, sobald Du versuchst die Texture zu laden.

Gruß
Thomas

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 16, 2007 22:38 
Offline
DGL Member

Registriert: Do Jul 05, 2007 00:45
Beiträge: 16
Beim ersten mal lade ich die Texturen natürlich so:
Code:
  1.  
  2. procedure TFormMatrix.LoadTextures;
  3. begin
  4.   Texture[0]:= TGLBmp.Create;
  5.   Texture[0].LoadImage(TexturName);
  6.   Texture[0].GenTexture(False,False);
  7. end;
  8.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 17, 2007 08:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Es funktioniert problemlos, wenn man mit der glBMP erneut GenTexture aufruft. Sollte die Textur bereits erstellt sein so wird diese dann gelöscht und neu angelegt. Also sobald deine Klasse TFormMatrix erstellt wird würde ich empfehlen, dass du alle Instanzen von glBMP erstellst. Einfach nur die Klassen erstellen. Oder aber in den Methoden LoadTexture überprüfst du ob diese noch nil sind wenn ja werden sie angelegt. Und nur dann. Wenn dein TFormMatrix frei gegeben wird gibst du alle Instanzen frei. Sollte eine Instanz noch nicht erstellt wurden sein wird NIL.free nichts machen. Free überprüft das intern bereits selber. Ich teste es aber selber meistens trotzdem noch.

Aber sonst kann ich dazu nichts sagen. Denn dazu fehlen leider weitere Informationen. Denn wir können so nicht sehen was du sonst noch mit den Texturen machst und deine Aussage "Die Texturen werden DANN nicht alle angezeigt." hilft da auch nicht wirklich. Also falls es immer noch Probleme gibt soltest etwas mehr code posten oder falls es etwas mehr code ist dann entweder als Anhang anhängen oder so was in dem dreh.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 18, 2007 23:20 
Offline
DGL Member

Registriert: Do Jul 05, 2007 00:45
Beiträge: 16
- na ja, die Frage wäre, wie ich mein Programm debugge, wenn einige Texturen nach dem laden nicht angezeigt werden.
- openGL Fehler fange ich ab mit "gluErrorString(glGetError)"
- einen openGL Fehler scheint es also nicht zu geben.
- welche Möglichkeiten der Fehlersuche gibt es noch? wie macht Ihr das bei openGL?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 19, 2007 09:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na ja. OpenGL Debuggen geht eher nur bedingt. Es gibt zwar ein gDebugger aber der kostet etwas. Ansonsten musst du hast genau darauf achten was du tust und wenn du deine Anwendung debuggst dann auch darauf achten was du an OpenGL übergibst und ob alles so klappt wie du dir das vorstellst. Falls generell Lücken existieren solltest du dir mal unser debugging Tutorial anschauen.

Und ansonsten kann ich nur das sagen was ich schon im letzten Beitrag gesagt habe. Uns fehlen da ein paar Informationen/Code. Denn ich tippe nach wie vor darauf, dass der Fehler eher wo anders zu suchen ist als in der Nähe des Creates.

gluErrorString(glGetError): Wenn du es so verwendest wie ich mir das denke, dann könnte es passieren, dass Fehler womöglich nur ganz kurz aufblinken. Ich finde es besser, wenn man es so macht, dass man sich das Resultat von glGetError erst einmal in einer Variable sichert und im Falle eines Fehler die Meldung via ShowMessage oder so darstellt. Damit würde man in jedem Falle dafür sorgen, dass die Meldung die Anwendung blockiert und nicht nur womöglich kurz aufblinkt.

PS: Wenn der Code nicht zu groß ist, dann kannst ihn ja mal irgendwo hochladen (mit allen benötigten Dateien) und uns zur Verfügung stellen. Das wird wohl eher das Einfachste sein. Aber ich für meinen Teil bin ab Freitag nachmittag nicht da bzw habe heute noch alle Hände voll zu tun. Es kann also passieren, dass ich mir den erst am Montag anschauen kann. Wenn ihn sich bis dahin noch niemand angeschaut hat.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder 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 ]