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