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:
For i := TexturAnzahl downto 1 do
glDeleteTextures(1, @i);
bzw.:
Code:
For i := 1 to TexturAnzahl do
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.
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 network • my 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
"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.
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.
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
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.
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.
weshalb funktioniert dann der Aufruf einer Textur mit den Zahlen, die ich definiert habe?
Ein weiteres Problem ist diese Funktion:
Code:
For i := 1 to Texturanzahl do
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.)
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.
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?
"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:
ActivateRenderingContext(DC, RC);
For i := TexturAnzahl downto 1 do begin
MemoKonsole.Lines.Add(BoolZuStr(glIsTexture(i)));
glDeleteTextures(1, @i);
MemoKonsole.Lines.Add(BoolZuStr(glIsTexture(i)));
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?
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.
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.^^
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.