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

Aktuelle Zeit: So Jun 09, 2024 00:12

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Feb 16, 2013 04:31 
Offline
DGL Member

Registriert: Fr Feb 15, 2013 21:13
Beiträge: 22
Programmiersprache: Object Pascal
Hallo Leute,

gleich vorab: Ich benutze Lazarus und Windows 7, 64-bit.

Ich versuchte gerade eine 2D-Textur in mein Programm zu laden. Nach der Zeile
Code:
  1. tex := IMG_Load(PChar(ExtractFileDir(ParamStr(0)) + '\textures\wall.jpg'));
ist der Wert von tex jedoch nach wie vor nil. Hier wird das gleiche Problem beschrieben:
Zitat:
SDL 1.2 kann kein 64bit. Ist schon ein länger bekanntes Problem.
Als Lösungsansatz verwendete ich GlBitmap. Sobald ich die Unit aber in mein Projekt einbinde, erhalte ich beim Kompilieren folgende Meldung:
Zitat:
Error: Import library not found for c
(wie hier)

Hat jemand eine Idee, wie man das Problem beheben könnte? Hier wird das ganze diskutiert... nur leider kann ich damit nichts anfangen.

EDIT: Habe in der glBitmap.pas {$linklib c} auskommentiert... dadurch krieg ich das Programm zumindest zum laufen. Mal schauen, ob es dann auch funktioniert...

Grüße, BS


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Feb 16, 2013 08:04 
Offline
DGL Member

Registriert: Fr Feb 15, 2013 21:13
Beiträge: 22
Programmiersprache: Object Pascal
Ok, ich sitze jetzt seit über 5h daran, diese blöde Textur zu laden und bin gerade ziemlich am verweifeln... Ich fasse mal zusammen, was ich so in meinem Kopf habe:

  • Der im Tutorial beschriebene Weg scheint aufgrund der Imkompatibilität von SDL und 64-bit-Systemen nicht zu funktionieren. Ich habe auch schon eine SDL.dll gefunden, die angeblich funktioneren soll, allerdings keine SDL_image.dll... :x

  • Beim Glbitmap loader von Lossy eX bekomme ich den "Import library not found for c"-Error. Wenn ich {$linklib c} auskommentiere, läuft das Programm zwar, aber die Textur erscheint nicht. Und ich bekomme eine Fehlermeldung, wenn das Quellformat nicht BMP ist. Wenn ich mich nicht irre fehlen mir hier einfach noch ein paar Befehle zwischen
    Code:
    1. fTexture.GenTexture;
    und
    Code:
    1. glEnable(GL_TEXTURE_2D);
    Ich habe versucht die Zeilen aus dem Tutorial da rein zu bekommen, jedoch scheitert das dann spätestens bei
    Code:
    1. glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h, 0, GL_RGB, GL_UNSIGNED_BYTE,tex^.pixels;
    da bei den beiden Methoden andere Datentypen verwendet werden.

    Hier habe ich wenigstens noch die "Hoffnung" das ich gerade einfach zu doof bin und das eigentlich total trivial ist.

  • Ich habe mir einige Besipielprogramme angeschaut und versucht die dort enthaltenen Loader zu verwenden (Textures.pas und BMP.pas -> Dateianhänge). Diese widerrum verlangen unter uses nach JPEG. Ohne diese Unit /Bibliothek/was auch immer haben sie ein Problem mit
    Code:
    1. external glu32;
    Habe mehrere JPEG.pas und glu32.dll gedownloaded und ausprobiert - ohne Erfolg.

Wie gesagt, ich bin gerade ziemlich verweifelt was die Texturen-Geschichte (u.a.^^) angeht. Daher wäre mir jedes Mittel recht da irgendwie weiter zu kommen. Wenn jemand einen funkionieren Quellcode hat, immer her damit. Falls jemand mir sagen kann, wo genau ich zu blöd war und was da hätte stehen müssen soll mir das auch recht sein. :roll:


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Feb 16, 2013 11:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Hi,
ich habe mir grade mal das Programm aus dem Texture Tutorial heruntergeladen und die glBitmap eingebunden. Wie du schon vermutet hast muss der "ifndef WIN32"-Block in der glBitmap auskommentiert werden. Danach musst du nur noch folgendes beim laden ändern/einfügen, da sonst die Texturen (wie du es beschrieben hast) nur weis dargestellt werden:
Code:
  1. texture1 := TGLBitmap2D.Create('./texture/numbers.bmp');
  2. texture1.GenTexture();
  3.  
  4. texture1.Bind(true);
  5. texture1.SetWrap(GL_REPEAT,GL_REPEAT,GL_REPEAT);
  6. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  7. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

In der Zeichen-Procedure musst du dann nur noch "texture1.Bind();" aufrufen.

Grüße, Mori

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Feb 16, 2013 16:52 
Offline
DGL Member

Registriert: Fr Feb 15, 2013 21:13
Beiträge: 22
Programmiersprache: Object Pascal
Zunächst einmal danke für die Antwort. Ich hab das was du geschrieben hast versucht so gut umzusetzten wie möglich.

Ausschnitt aus glBitmap.pas:
Code:
  1.    //{$ifndef WIN32}
  2.     //{$linklib c}
  3.   //{$endif}

(vorher hatte ich nur {$linklib c} auskommentiert. Macht das einen Unterschied?)

Die Prozedur zum Laden der Textur habe ich genauso übernommen (mit anderem Dateinamen natürlich ;) ):
Code:
  1. procedure LoadTexture;
  2. begin
  3.   texture1 := TGLBitmap2D.Create('./texture/wall(2).bmp');
  4.   texture1.GenTexture;
  5.  
  6.   texture1.Bind(True);
  7.   texture1.SetWrap(GL_REPEAT, GL_REPEAT, GL_REPEAT);
  8.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  9.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  10. end;

(Im Übrigen scheint es ja egal zu sein, ob ich in der Pfad-Angabe Slashes oder Backslashes verwende, oder sehe ich das falsch? (Hab beides ausprobiert - gleiches Ergebnis.))

Allerdings bekomme ich, wenn ich texture1.Bind() erneut in der Zeichenprozedur aufrufe an dieser Stelle eine Error-Meldung: "Projekt project1 hat Exception-Klasse >>External: SIGSEGV<< auseglöst."

Das Programm läuft, wenn ich das erneute texture1.Bind() weglasse. Wird auch alles ordentlich angezeigt - eben bis auf die texturierte Fläche. Die ist weiß (bzw. grün bei mir^^) An welche Stelle muss der Befehl denn genau? Der Abschnitt in dem ich die Fläche texturieren möchte sieht im übrigen so aus:
Code:
  1.   glEnable(GL_TEXTURE_2D);
  2.  
  3.   //Vorne
  4.  
  5.   glTexCoord2f(0, 0);
  6.   glVertex3f(-1, 1, 1);
  7.   glTexCoord2f(0, 1);
  8.   glVertex3f(-1, -1, 1);
  9.   glTexCoord2f(1, 1);
  10.   glVertex3f(1, -1, 1);
  11.   glTexCoord2f(1, 0);
  12.   glVertex3f(1, 1, 1);
  13.  
  14.   glDisable(GL_TEXTURE_2D);  


Freue mich auf eine Antwort!
Grüße, BS


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Feb 16, 2013 18:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
BlueScream hat geschrieben:
[...] vorher hatte ich nur {$linklib c} auskommentiert. Macht das einen Unterschied?)
Nein das dürfte keinen Unterschied machen, wenn du nur das {$linklib c} auskommentierst wird zwar die Bedingung geprüft, aber nichts ausgeführt.

BlueScream hat geschrieben:
Allerdings bekomme ich, wenn ich texture1.Bind() erneut in der Zeichenprozedur aufrufe an dieser Stelle eine Error-Meldung: "Projekt project1 hat Exception-Klasse >>External: SIGSEGV<< auseglöst."
Eventuell hast du die Variable texture1 freigeben, oder du greifst auf sie zu bevor du sie überhaupt erzeugt hast. Das müsstest du einfach mal mit dem Debugger prüfen.

BlueScream hat geschrieben:
Das Programm läuft, wenn ich das erneute texture1.Bind() weglasse.
Das liegt dran, das OpenGL sich "merkt" das texture1 noch vom Erstellen gebunden ist. Wenn du mehrere Texturen benutzt musst du diese beim Zeichnen binden, da OpenGL eine Statemachine (wie hier http://wiki.delphigl.com/index.php/Einsteigerpfad im letzten Abschnitt erklärt) ist und immer die zuletzt gebundene Textur benutzt.

BlueScream hat geschrieben:
An welche Stelle muss der Befehl denn genau?
Das Binden sollte vor dem glBegin/glEnd-Block stehen da intern http://wiki.delphigl.com/index.php/glBindTexture aufgerufen wird, welches die aktuelle Textur für nachfolgende Geometrie setzt.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Feb 16, 2013 19:19 
Offline
DGL Member

Registriert: Fr Feb 15, 2013 21:13
Beiträge: 22
Programmiersprache: Object Pascal
mori hat geschrieben:
Eventuell hast du die Variable texture1 freigeben, oder du greifst auf sie zu bevor du sie überhaupt erzeugt hast. Das müsstest du einfach mal mit dem Debugger prüfen.
*FACEPALM* ... Man sollte die Prozedur natürlich auch einbinden, bevor man sie benutzen möchte.

mori hat geschrieben:
Das Binden sollte vor dem glBegin/glEnd-Block stehen da intern http://wiki.delphigl.com/index.php/glBindTexture aufgerufen wird, welches die aktuelle Textur für nachfolgende Geometrie setzt.
Ok, so hatte ich das auch verstanden und implementiert. Dein Kommentar hat aber zu dem Glücklichen Zufall geführt, dass ich bemerkt habe, dass ich meine CreateSphere-Prozedur, mit der ich mich auch schon seit einer Weile rumquäle innerhalb von glBegin(GL_QUADS)/glEnd befunden hat... aber das nur am Rande. :D

Um mal zu Potte zu kommen:
Die Textur wird angezeigt. Allerdings ist sie halbtransparent, sodass die Hintergrundfarbe durchscheint. (Alphakanal?) Außerdem ist plötzlich die gesamte Szene dunkler. (???)

Zwei kleine Fragen noch am Ende:
1. Was genau macht
Code:
  1. texture1.SetWrap(GL_REPEAT, GL_REPEAT, GL_REPEAT);
? Habe mir den Verweis in der Wiki unter Glbitmap loader angeschaut, bin daraus aber nicht wirklich viel schlauer geworden.
2. Im Wiki-Beitrag steht, dass der Glbitmap loader auch andere Dateiformate als .bmp unterstützt. Nehme ich einfach meine Prozedur und versuche damit z.B. eine Datei im .jpg-Format zu laden, bekomme ich vom Debugger die Nachricht
Zitat:
LoadFromStreeam - Couldn't load Stream. It's possible to be an unknow Streamtype.

In der glBitmap fand ich folgende Code-Zeilen:
Code:
  1. var
  2.   Bmp: TBitmap;
  3.   Jpg: TJPEGImage;    
  4. [...]
  5.   jpg.LoadFromStream(Stream);
  6.   bmp.Assign(jpg);
  7.   Result := AssignFromBitmap(bmp);

Kann ich diese verwenden um JPGs zu laden? Und wenn ja, wie muss ich den Code einbinden.

LG, BS


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Feb 16, 2013 19:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
"SetWrap(GL_REPEAT, GL_REPEAT, GL_REPEAT);" benutzt intern glTexParameter. Wie im Artikel beschrieben legen die Parameter fest, wie die Textur bei Zugriffen über ihre eigentliche Größe hinaus behandelt werden soll (bei zB. GL_REPEAT wird sie einfach wiederholt).

BlueScream hat geschrieben:
Die Textur wird angezeigt. Allerdings ist sie halbtransparent, sodass die Hintergrundfarbe durchscheint.
Eventuell bist du, wie ich selber schoneinmal in FBO zeigt Farben nicht, auf das Problem mit Farbe und Texturen gestoßen. Du musst bevor du du Texturen benutzt "glColor4f(1.0, 1.0, 1.0, 1.0)" aufrufen, um die Farbe auf Weis zu stellen. Intern werden sonst glColor-Farbe und Textur kombiniert und die Szene wirkt dunkler/transparent.

_________________
You even trying ...

Website: http://rise-of-light.de/


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 24 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.125s | 15 Queries | GZIP : On ]