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

Aktuelle Zeit: Mi Jul 16, 2025 19:19

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Falsche Displaylist
BeitragVerfasst: Mo Dez 20, 2010 18:59 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hi,

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:
Code:
procedure DrawTexture(pX, pY, pW, pH, pZ : Single);
begin
  glBegin(GL_QUADS);
    glTexCoord2f(1, 0);
    glVertex3f(pX+pW, pY   , -pZ);
    glTexCoord2f(0, 0);
    glVertex3f(pX   , pY   , -pZ);
    glTexCoord2f(0, 1);
    glVertex3f(pX   , pY+pH, -pZ);
    glTexCoord2f(1, 1);
    glVertex3f(pX+pW, pY+pH, -pZ);
  glEnd;
end;


Gruß,
Nils

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Falsche Displaylist
BeitragVerfasst: Mo Dez 20, 2010 19:39 
Offline
DGL Member

Registriert: Mo Dez 20, 2010 19:31
Beiträge: 11
Was passiert den genau bei Bind(5)?
Gruss,
Nils


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Falsche Displaylist
BeitragVerfasst: Mo Dez 20, 2010 19:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
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;

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Falsche Displaylist
BeitragVerfasst: Mo Dez 20, 2010 20:11 
Offline
DGL Member

Registriert: Mo Dez 20, 2010 19:31
Beiträge: 11
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Falsche Displaylist
BeitragVerfasst: Mo Dez 20, 2010 20:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
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.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Falsche Displaylist
BeitragVerfasst: Mo Dez 20, 2010 21:22 
Offline
DGL Member

Registriert: Mo Dez 20, 2010 19:31
Beiträge: 11
Ja so wars gemeint.
Schreib mal statt Bind(5) glBindTexture(GL_TEXTURE_2D, 22),
wissen was der fehler ist, weis ich aber nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Falsche Displaylist
BeitragVerfasst: Mo Dez 20, 2010 21:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
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.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Falsche Displaylist
BeitragVerfasst: Mo Dez 20, 2010 22:21 
Offline
DGL Member

Registriert: Mo Dez 20, 2010 19:31
Beiträge: 11
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Falsche Displaylist
BeitragVerfasst: Mo Dez 20, 2010 22:32 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
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.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Falsche Displaylist
BeitragVerfasst: Mo Dez 20, 2010 22:54 
Offline
DGL Member

Registriert: Mo Dez 20, 2010 19:31
Beiträge: 11
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Falsche Displaylist
BeitragVerfasst: Di Dez 21, 2010 00:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
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 ?

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Falsche Displaylist
BeitragVerfasst: Di Dez 21, 2010 00:41 
Offline
DGL Member

Registriert: Mo Dez 20, 2010 19:31
Beiträge: 11
Versuch mal DrawTexture(...); in eine Displaylist zu schreiben und Bind(5) immer vor glCallList zu schreiben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Falsche Displaylist
BeitragVerfasst: Di Dez 21, 2010 10:32 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Falsche Displaylist
BeitragVerfasst: Di Dez 21, 2010 11:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
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.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.016s | 18 Queries | GZIP : On ]