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

Aktuelle Zeit: Mo Jul 14, 2025 17:30

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



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Fr Feb 20, 2009 18:40 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Hallöle, ich bins mal wieder.^^

Seit einiger Zeit stehe ich vor einem Problem, das die Welt in Angst und Schrecken versetzt.... na gut das ist jetzt übertrieben, aber trotzdem. ;)

Code:
  1. For i := TexturAnzahl downto 1 do
  2.   glDeleteTextures(1, @i);


bzw.:

Code:
  1. For i := 1 to TexturAnzahl  do
  2.   glDeleteTextures(1, @i);


Ja, also allzuviel ist da nicht zu sagen, alle Texturen sollen gelöscht werden, OpenGL... tut das allerdings nicht.
Eine Fehlermeldung bringt mir das zwar nicht, aber es verbraucht Speicher und überschreiben kann ich die Texturen auch nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 20, 2009 18:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Du solltest die IDs der Texturen direkt aus deiner Texturverwaltung ziehen. Du kannst nicht sicher sein, dass die Fortlaufend sind. Ich frage mich nur, woran erkennst du, dass sie nicht gelöscht werden?

Gruß Lord Horazont

//Edit: Überschreiben: glTexSubImage oder auch glTexImage nochmal auf die gleiche ID anwenden. Du musst dafür nicht immer glGenTextures verwenden (nur um einmal die ID zu bekommen, danach kansnt du das ding sooft du willst mit gl(Copy)Tex(Sub)Image bearbeiten wie du willst).

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 20, 2009 19:06 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
"Du solltest die IDs der Texturen direkt aus deiner Texturverwaltung ziehen. Du kannst nicht sicher sein, dass die Fortlaufend sind."
Es sollen aber ALLE Texturen gelöscht werden und ausser bei Eintritt dieses Ereignisses werden keine gelöscht, also gibt es auch keine Lücken.

"Ich frage mich nur, woran erkennst du, dass sie nicht gelöscht werden?"
Ich erkenne das
1. daran, das beim neuladen der Texturen die Texturzuweisungen nicht wieder bei 1 anfangen und
2. daran, das die Texturen auch nach dem löschen noch angezeigt werden, ohne das welche neu geladen wurden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 20, 2009 20:03 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Wer sagt denn, dass nach dem Löschen wieder bei 0 angefangen wird? Daran kannst du es jedenfalls nicht erkennen.
Wie gesagt, nehme mal die richtigen IDs, dann sollte das auch funktionieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 20, 2009 20:28 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
"2. daran, das die Texturen auch nach dem löschen noch angezeigt werden, ohne das welche neu geladen wurden." :roll:

Die IDs werden auch wieder zurückgesetzt, bloß weißt der ja dann trotzdem die anderen (höheren) Werte zu.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 14:05 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Du solltest es wirklich mal mit den echten IDs versuchen, nicht mit "berechneten".
Falls es dann immer noch nicht geht, dann haben wir zumindest einen Fehlerfall ausgeschlossen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 14:38 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Wäre jemand mal so nett und würde mir sagen wie ihr das mit den "ECHTEN IDs" meint?

Ich generiere die IDs der Reihe nach, also erst kommt die 1, dann die 2, dann die 3 usw....

und wenn ich die IDs binde, dann verwende ich genau diese Werte, also 1, 2, 3 usw...

Also müsste ich sie doch auch so löschen können, erst die 1, dann die 2, dann die 3 usw...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 14:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Du kannst IDs nicht selbst vergeben. Du musst dir diese immer von OpenGL holen (z.B. mit glGenLists, etc.), denn OpenGL verteilt und verwaltet die. Wenn du jetzt z.B. dreimal hintereinander eine Displayliste erstellst muss es nicht unbedingt sein dass die IDs dieser Listen auch x+1, x+2 und x+3 sind. Das gilt für alle IDs in OpenGL, von daher also niemals einfach selber verteilen sondern immer von OpenGL anfordern.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 14:55 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Die IDs von glGenTextures sind nur Vorschläge. glGenTextures erstellt keine Texturen. Das Textureobjekt wird beim ersten glBindTexture erzeugt. Der OpenGL Treiber muss intern eine Hashtabelle verwalten, da man die IDs tatsächlich frei wählen kann. Das gleiche gilt für IDs von Buffern und Fragment/Vertex-Programmen. Um diesen Aufwand zu verringern geben alle Funktionen des neuen Objektmodells beim Erstellen gleich die ID zurück z.B: glCreateShader.

Man kann mit glIsTexture prüfen, ob einer ID noch eine Texture zugeordnet ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 16:24 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Ich bin verwirrt...

weshalb funktioniert dann der Aufruf einer Textur mit den Zahlen, die ich definiert habe?

Ein weiteres Problem ist diese Funktion:

Code:
  1. For i := 1 to Texturanzahl do
  2.         showmessage(BoolZuStr(glIsTexture(i)));


Texturanzahl ist 10 und "BoolZuStr" ist eine von mir selbst definierte Funktion, die entweder "Ja" oder "Nein" zurückgibt (ich hätte auch BoolToStr verwenden können, aber die Rückgabe mit "0" und "-1" find ich unschön, spuckte aber letztlich dasselbe Ergebnis aus.
1 bis 10 sind Texturen


Zu meinem Problem nochmal:
Ich will ALLE (naja, bis auf die Textur 0 versteht sich. ;) ) Texturen löschen um beispielsweise ein neues Projekt zu laden und dessen Texturen zu laden (das neue geladene Projekt verwendet ja nicht zwangsweise die alten Texturen.)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 16:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 15:18
Beiträge: 62
Wenn du ohnehin wieder bei 1 anfängst zu zählen, dürfte das doch nicht so schlimm sein, dass die Texturen nicht gelöscht werden. Die neuen Aufrufe werden die alten ja einfach überschreiben, und die übrig gebliebenen verwendest du einfach nie. Solange der VRAM durch die "Überlappenden" nicht überfüllt wird, machen die ja nichts aus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 17:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Da du ja jedesmal ein neues Projekt laden willst ist es eigentlich besser jedesmal den Renderkontext zu zerstören und neu zu erstellen. So sollte sichergestellt sein dass alle mit ihm verbundenen Ressourcen auch aus dem VRAM entfent werden, zumindest solange der Treiber das ordentlich macht. Ansonsten verstehe ich immer noch nicht warum glDeleteTextures bei dir nicht funzt, ich hab selbst keinerlei Probleme damit. Sicher dass du zum Zeitpunkt des Löschens einen Renderkontext aktiviert hast, bzw. im korrekten Kontext bist?

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 22, 2009 10:33 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
"Sicher dass du zum Zeitpunkt des Löschens einen Renderkontext aktiviert hast, bzw. im korrekten Kontext bist?"

Nachdem ich das gelesen hatte, dachte ich es könnte das sein, es stellte sich aber kurzerhand raus, das es das auch nicht ist.
Zum einen hab ich den Standardkontext wieder aktiviert und zum anderen das ganze noch hiermit geprüft:
Code:
  1. ActivateRenderingContext(DC, RC);
  2.       For i := TexturAnzahl downto 1 do begin
  3.         MemoKonsole.Lines.Add(BoolZuStr(glIsTexture(i)));
  4.         glDeleteTextures(1, @i);
  5.         MemoKonsole.Lines.Add(BoolZuStr(glIsTexture(i)));
  6.       end;

Und jedesmal gab er mir ein WAHR zurück, also sowohl vor, als auch nach der Löschung.

Hab das ganze jetzt noch an einem anderen Rechner getestet, mit demselben Ergebnis.

Ich benutze übrigens zum Laden der Bilder "PSDLSurface" und das veraltete "TglBMP" (fals es irgendwie relevant sein sollte).


Die Methode zum löschen und neuerstellen des Kontextes scheint mir auf den ersten Blick wenig problematisch, gibt es einen Grund dies nicht zutun?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 25, 2009 19:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Tu mir mal einen Gefallen und probier folgende Datei aus : http://www.saschawillems.de/misc/opengldeletetexturetest.exe (180 KB)

Bei mir führt das zu folgender Ausgabe :
Bild

P.S. : Delphis BoolToStr kann mehr als nur 0 und 1 zurückgeben, es hat ja zwei Parameter. Einfach mit BoolToStr(test, True) aufrufen und du bekommst passende Strings zurück.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 25, 2009 22:23 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Gibt bei mir dasselbe zurück.

Wollte eigentlich heute oder so diese Löschung und Neuerstellung des RenderKontextes testen, bin aber nicht dazu gekommen/habs vergessen. ;)

Zu der BoolToStr Sache: mag zwar sein, aber:
1. ich spare ein Parameter (was einen wahnsinnigen.... geringen Geschwindigkeitsvorteil sein muss^^)
2. wie du vllt an meinem Schreibstil merkst, so gefällt mir die deutsche Sprache mehr als die englische und somit ist mir JA und NEIN lieber als TRUE und FALSE, zumal sich das deutsche besser mittig bei COURIER NEW platzieren lässt.^^ ;) :P


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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 | 15 Queries | GZIP : On ]