Registriert: Mi Apr 09, 2008 16:28 Beiträge: 52 Wohnort: Münster
Hey
Ich hab hier wiedermal eine relativ kleine Frage:
Und zwar ergibt sich bei mir beim Texturen laden ein Problem nämlich dass der Befehl glBindTexture();
für die Texture ID das Format Cardinal verlangt und der Befehl zum löschen der Textur glDeleteTextures(); das Format PGLuint .
Da ich aber beides brauche weiß ich nicht weiter.
Könnte mir da jemand vielleicht einen Tipp geben?
LG
Registriert: Mi Apr 09, 2008 16:28 Beiträge: 52 Wohnort: Münster
Und was heißt das dann was ich verändern müsste ?
Ich kenn mich leider überhaupt nicht mit Pointern und so aus deshalb weiß ich jetz nich so genau was ich da ändern muss
_________________ "Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon
Registriert: Mi Apr 09, 2008 16:28 Beiträge: 52 Wohnort: Münster
Ahhh ok vielen Dank das funktioniert Den Befehl glDeleteTextures(1,@TexID); darf man doch auch in die Render Procedure schreiben oder?
Als ich das jetzt mit dem TGluint gemacht hatte warn nämlich auf einmal meine Texturen weiß. (solange ich glDeleteTextures(1,@TexID); noch in der Texturen Procedure hatte).
Wenn ich das in die Render Procedure schreibe dann sieht man sie aber wieder. Ich hoffe ma dass das jetz kein Fehler is?
_________________ "Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon
die Textur solltest du erst beim beenden deines Programms löschen. Wenn du glDeleteTextures aufrufst wird sie nämlich gelöscht, und das willst du ja nicht, oder?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Pointer: Pointer sind Variablen die eine Adresse auf eine Speicherstelle einhalten. Im Falle von glGenTextures werden Pointer dazu benutzt um die ID einer von OpenGL erstellten Textur zurückgeben zu können. Wenn du die Variable bereits als PGLuint deklarierst, dann zeigt der Pointer auf keinen gültigen Speicherbereich und Zugriffe darauf laufen ins Nirvana oder irgend woander hin. Dazu gibt es den @ Operator. Der liefert die Adresse einer Speichervariable zurück. Und die kann OpenGL dann dazu verwenden um die ID der Textur abzulegen.
Die Texturen sollten für den Anfang zu mindest nur außerhalb des Rendern laden. Du musst dann aber darauf achten, dass du die TexturID irgendwo ablegst wo du später auch noch darauf zugreifen kannst. Typischerweise werden die Texturen nach dem Initialisieren geladen und später werden die Texturen nur noch gebunden und aktiviert.
glDeleteTextures direkt nach dem Laden der Texturen aufzurufen ist nicht so praktisch. Denn damit löscht du deine Texturen augenblicklich wieder. Was aber vermutlich eher nicht ganz Sinn und Zweck ist. glDeleteTextures solltest du erst dann aufrufen, wenn du die Textur ganz gewiss nicht mehr brauchst. Entsprechen brauchst du die Texturen auch nur ein einziges Mal laden.
Registriert: Mi Apr 09, 2008 16:28 Beiträge: 52 Wohnort: Münster
Ja da sprecht ihr gleich das nächste Thema an mit dem ich Probleme hab.
Ich weiß zwar dass man die Texturen eigentlich beim Initialisieren laden sollte und dann in Hashlisten oder so ablegen .
Allerdings hab ich noch nie mit Hashlisten gearbeitet (ich weiß nur so ungefähr wie sie funktionieren).
Wenn ihr mir vielleicht sagen könntet wie man so eine Hashliste überhaupt erstellt und wie man da die Texturen drin ablegen kann und so das wär super
Ach ja und was ich mich schon lange frage:
Wie kann man diese abgelegten Texturen denn dann überhaupt in der Render Procedure wieder aufrufen?
PS: Danke schön schonmal für eure Antworten bis jetzt
_________________ "Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon
Registriert: Fr Mai 16, 2008 20:26 Beiträge: 158 Wohnort: Berlin
Programmiersprache: c++,c#,java,ruby,php
Eine Hashliste, Hashmap oder auch assoziatives Array (Je nach Programmiersprache) ist eigentlich nichts weiter als eine Art Tabelle mit einer Key <-> Object Beziehung.
Ein Key darf genau einmal dadrin vorkommen z.B. eindeutige Nummern oder Strings ( z.B. Texturnamen wie sky_1.tga) als Objekt kann man eigentlich alles nehmen was es so gibt, diese dürfen auch mehrmals vorkommen aber mit verschiedenen Keys. Wenn man nun auf die Daten zugreifen will, aber nur den Texturnamen hat, sucht man nach genau diesem, welcher als Key gespeichert wurde und bekommt als Rückgabewert die Texturid oder die Textur je nachdem ^^ Diese Id kann man dann mit
Code:
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, deinetexturid);
binden. Aber nicht vergessen
Code:
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
aufzurufen, wenn die Textur nicht mehr benutzt wird, ansonsten bleibt sie für nachfolgende Dreiecke etc. bestehen und verfälscht eventuell Farben usw.
Die Hashlisten sind auch schneller, als wenn man eine verkette Liste von vorne nach hinten druchgehen müsste und jedes Objekt selber indentifizieren müsste.
Wie das genau in Delphi geht weiß ich leider nicht.
hoffe das hat ein bisschen geholfen ertsmal mfg ^^
_________________ System: Phenom XII X4 955 3,21Ghz , GTX 560 TI, 4GB-Ram, Windows 7 64x
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich hatte mal eine Unit mit 2 Klassen für Hashs geschrieben. Mit der kannst du String <> Pointer Paare und Integer <> Pointerabspeichern.
Allerdings wie du die Sachen abspeicherst ist dir vollkommen dir überlassen. In Programmen mit dynamischem Inhalt ist es meistens nur so, dass diese über Namen angesprochen werden müssen. Und dann wirst du um einen Hash kaum herum kommen. Wobei
ja, kannst du. Die Hashliste dient halt nur dazu, Texturen über einen eindeutigen Key anzusprechen.
Für den Anfang reicht sicherlich ein array of Tgluint aus. Du musst nur selbst wissen, welche Textur jetzt wo im Array ist.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wenn du nur 2-3 Texturen fest in deinem Programm hast, dann kannst du auch einfache Variablen dafür verwenden. Das Sschöne am Programmieren ist ja, dass du es so machen kannst wie du es haben willst.
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.