ich will einfach ein paar Displaylisten erzeugen und diese dann wenn nötig abrufen. Das ganze in einem Array of record, also:
Code:
with ...[High(...)] do begin DL := glGenLists(1); glNewList(DL, GL_COMPILE); Bind(5); DrawTexture(0.0, 0.0, aW, aH, 0.0); glEndList; end;
Es soll eine einfache Textur reingezeichnet werden, 5 ist ein Wert der dem Texturmanager bekannt ist, das Ergebnis interessiert auch erstmal nicht, hauptsache es kommt auch die Textur mit 5 auf den Bildschirm - was nicht der Fall ist. Etwas weiter vorne im Code erzeuge ich mit dem Bitmapfont-Loader ebenso Displaylisten in der Art:
Code:
LoadTexture(Filename, FontTexId); FontBase := glGenLists(256); for x := 0 to 15 do for y := 0 to 15 do begin glNewList(FontBase+x+y*16, GL_COMPILE); ... glEndList; end;
Es wird die Bitmapfont geladen in der ersten Zeile. Dann wird sie durchlaufen und die einzelnen Zeichen werden in Displaylisten gepackt. Warum poste ich das ? Weil dummerweise, die Bitmapfont-Textur, welche in FontTexId liegt, diejenige Grafik ist, welche mir der zuerst gezeigte Code IMMER anzeigt - also wenn man die dort erstellte Liste abruft. Warum sehe ich beim ersten Code immer die Bitmapfont-Grafik, aber nie die im ersten Code erwünschte Grafik ? Es wirkt für mich so, als hingen die Displaylisten damit zusammen. Zur Vollständigkeit, hier noch DrawTexture:
Sry, hätte das dazu posten sollen. Der Texturmanager schaut einfach nach der ID und bindet die Textur, im Code so:
Code:
procedure Bind(Id : Integer); var i : Integer; begin for i := 0 to High(Tex) do if Tex[i].Id = Id then begin glBindTexture(GL_TEXTURE_2D, Tex[i].Textur); Break; end; end;
Einen Fehler finde ich jetzt nicht, ich vermute aber einen fehler im Texturmanager. Um zu schauen ob die Texturen falsch gebunden werden kannst du ja mit glGet(GL_TEXTURE_BINDING_2D) den Namen der FontTexur bekommen und schauen ob nach Bind(5) immernoch dieser Texurname gebunden ist.
Du meinst also, dass ich beim zweiten Code, einmal kurz binden soll, dann glGet machen, abspeichern und das gleiche nochmal beim ersten Code (erste/zweite Code bezieht sich auf oberster Post hier) ? Dann habe ich beim zweiten Code 1 und beim zweiten 22 - also unterschiedlich.
Hm, dann kriegt man eine andere Textur. Der Texturmanager macht halt seine eigene Nummerierung. Das soll er auch, damit alle Texturen klar nummeriert sind und keine Probleme auftreten.
Code:
type TTextur = record Id : Integer; Textur : GluInt; end; TDynTexArr = Array of TTextur;
var Tex : TDynTexArray;
function LoadTexture(Filename : String; aId : Integer) : Boolean; begin Result := False; if FileExists(Filename) then begin SetLength(Tex, High(Tex)+2); with Tex[High(Tex)] do begin Id := Succ(aId); Textur := CreateTexture(IMG_Load(PChar(Filename))); end; Result := True; end; end;
Das ist der Texturmanager eigentlich schon. CreateTexture lädt die Datei, die ID wird zugewiesen. Es ist nicht verwunderlich, dass glBindTexture(GL_TEXTURE_2D, 22) ein anderes Ergebnis liefert, da die Nummerierung seitens OpenGL evtl. eine andere ist.
Ich bin kein Delphier aber bei SetLength(Tex, High(Tex)+2); hatte ich die frage warum +2 und nicht +4 hinkommt, wir die lenge bei euch nicht in Byte angegeben?
Nein, in Integer wird das angegeben, das passt. Hm, schwierig, ich vermute einen Fehler mit der Displaylist. Gibt es da irgendwelche Möglichkeiten, etwas falsch mit zu machen. Wüsste halt nicht, was ich dann falsch gemacht habe.
Bei den Displaylisten kann hochstens ein befehl drinnen sein, der sofort ausgefuehrt und nicht in die Liste compiliert wird, aber glBindTexture wird in die Liste compiliert.
Habe nochmal etwas rumprobiert. Wenn ich die Displaylist weglasse, stattdessen direkt anstelle von glCallList
Code:
Bind(...); DrawTexture(...);
schreibe, funktioniert es. Also muss es was mit der Displaylist zu tun haben. Ich dachte mir nur, es wäre generell recht praktisch, Dinge die zigmal gezeichnet werden in eine Displayliste zu packen. Die Frage ist bloß, was genau schiefgeht bei der oben gezeigten Erstellung. Ich denke hiermit ist wenigstens ausgeschlossen, dass es mit dem Texturmanager zu tun hat. Gibt es irgendwelche Modi die nicht aktiv bzw. nicht aktiv sein dürfen beim Erstellen oder Abrufen der Displaylist ?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also ich persönlich würde nicht sagen, dass es nicht an dem TexturManager liegen kann. Ich sage aber auch nicht, dass es am Manager liegen muss (dafür kann man das Problem nicht gut genug überschauen). Der Manager ist in meinen Augen nur viel zu simpel gehalten. Zu mindest rudimentäre Fehlerprüfungen sollten enthalten sein. Es ist aber wirklich gar nichts enthalten. - Beim Erstellen einer Textur erzeugst du diese zum Beispiel mit Succ(). Also du übergibst 4 als ID und bekommst aber 5 als finale ID raus. Also wenn du die mit ID 5 erstellt hast müsstest du eigentlich Bind(6) aufrufen ansonsten würdest du die vorherige Textur bekommen. - Außerdem wird da nicht überprüft ob die ID schon mal vergeben wurde. Doppelt vergebene IDs würden problemlos geladen werden. Es könnte aber ausschließlich nur die Erste benutzt werden. Und zwar ohne, dass jemals jemand davon etwas merkt. - Beim Binden einer Textur bekommst du auch keinerlei Rückmeldung ob die Textur mit der ID gefunden wurde oder nicht. Sollte das Finden fehl schlagen, dann wird einfach die bestehende Textur behalten und wenn du als Entwickler glück hast, dann siehst es direkt. Wenn nicht dann fällt es erst ewig spät auf. Wenn überhaupt. Da würde im Falle einer nicht gefundenen Textur knallhart eine Exception auslösen. Dann merkst du es wenigstens sobald etwas schief läuft.
Zu den Displaylisten kann ich so nichts sagen, da die total simpel aufgebaut sind und ich solche Fehler nur im Zusammenhang mit fehlerhaften Befüllen kenne. Oder auch gern genommen. DisplayListe erstellen und dann lokale Dinge verändern die sich nicht auswirken bzw. oder sich auswirken obwohl man meint, dass sie sich nicht auswirken dürften.
Habe alle Deine Punkte mal ausgebessert. Und es gab tatsächlich vier Texturen die nicht gefunden wurden - hatte da einfach ein paar Zeilen vergessen - und doppelte IDs gab es einmal. Also alle Fehler beseitigt, aber dummerweise der Displaylist-Fehler immer noch nicht. Die Textur welche in der Displaylist landet ist die erste im Texturarray auffälligerweise.
Fehler gefunden. Die Texturladeroutine läuft erst nach der Erstellung der Displaylist durch. Ich weiß nicht ob ich lachen oder weinen soll.... Vielen Dank für Eure Hilfe! Immerhin ist jetzt der TexturManager besser, irgendwie hat jeder Fehler was gutes.
Mitglieder in diesem Forum: Bing [Bot] und 13 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.