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

Aktuelle Zeit: Di Jul 08, 2025 05:14

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Problem mit glBMP
BeitragVerfasst: Mi Mär 10, 2004 11:55 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Bin grad beim arbeiten an einem kleinen Spielchen. Allerdings macht mir schon die Texturierung probleme.

Mal mein Code:
Code:
  1. procedure ShowStartScreen;
  2. // Zeigt des Intro Bild
  3. var Texture : TglBMP;
  4. begin
  5.      glEnable(GL_TEXTURE_2D);
  6.      Texture := TglBMP.Create('\GFX\Startbild2.jpg');
  7.      Texture.GenTexture;
  8.      Texture.Bind;
  9.      glBegin(GL_QUADS);
  10.          glTexCoord2f(0,0); glVertex3f(-1,-1,0);
  11.          glTexCoord2f(0,1); glVertex3f( 1,-1,0);
  12.          glTexCoord2f(1,1); glVertex3f( 1, 1,0);
  13.          glTexCoord2f(1,0); glVertex3f(-1, 1,0);
  14.      glEnd;
  15.      Texture.Free;
  16.      glDisable(GL_TEXTURE_2D);
  17. end;


Ich sehr nur ein weißes Quad!? :evil: Ich hab schon mit den Texturkoordinaten rumgespielt aber nix hat geholfen. Seht ihr den Fehler?

PS: Die Procedure wird von meiner Renderprocedure aufgerufen. OpenGL ist korrekt initialisiert (normale farbige Quads gehen. Keine glError)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 10, 2004 12:13 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Also so wie ich das sehe machst Du folgendes:

- Texturing aktivieren (soweit ok)
- Texture-Objekt erstellen, die Textur laden und die OpenGL-Textur erstellen (auch OK)
- Textur binden/aktivieren (mit .Bind, auch in Ordnung)
- Quad mit Text-Koords zeichenen (soweit auch ok).

und jetzt gebinnen die Fehler. Erstens zeigst du das dargestellte nicht an (SwapBuffers fehlt). Ok, mag sein dass Du das auserhalb der Funktion machst. Aber der eigentliche Fehler liegt in
Code:
  1.   Texture.Free;
  2.   glDisable(GL_TEXTURE_2D);
  3.  

Du gibt die erstellte Textur wieder frei. Damit wird aber auch die in OpenGL registrierte Textur freigegeben und diese fehlt OGL dann zur Darstellung! Texturen sollten erst dann wieder freigegeben werden, wenn das Objekt welches die Textur verwendet, nicht mehr dargestellt werden soll (bsp. beim Laden eines neuen Levels oder beim Verlassen des Spiels). Außerdem solltest Du das Texturing in OpenGL solange aktiv lassen, solange Du Texturen darstellen willst!

Wie immer gillt: schau in die OpenGL-Dokus rein (RedBook, OpenGL-SDK-Help) sowie in die Turorials auf unserer Page. Das Prinzip von Texturen in OpenGL sollte man intus haben!

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 10, 2004 12:33 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ok... Du hast recht mit deiner vermutung: SwapBuffers wird außerhalb aufgerufen.

Nun sieht meine gliederung so aus:

UMain:
Init
SetupGL( diverse glEnable. U.a. glEnable(gl_Textur_2D))
render(ruft obige procedure auf)
...

UGFX:
diverse Grafik Proceduren u.a. obige

Ein glDisable(gl_Texture_2D) tauch mom. nirgendwo auf. Ich sehe trotzdem nur ein weißes Quad. :!: :?:

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 10, 2004 13:11 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Kann es damit zusammenhängen, dass meine Variable Texture nur innerhalb der Procedure bekannt ist?? Ich dachte es reicht aus, wenn man die Textur innerhalb der Zeichenprocedure zuweist? Oder muss ich eine globale Variable für das ganze Spiel erstellen, wo die TexturenIDs drinn gespeichert stehen?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 10, 2004 13:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Probieren geht über studieren ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 10, 2004 13:15 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Dasw Problem liegt hier wohl eher an Delphi: Texture ist ein Objekt, welches innerhalb deiner Prozedur definiert ist. Beim verlassen der Prozedur gibt der Compiler selber das Objekt wieder frei. Deswegen sollte das Textur-Objekt außerhalb der Prozedur deklariert werden!

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 10, 2004 13:38 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Die Antwort klingt plausibel...
Ich habe folgendes gemacht (ohne Erfolg).

-In meiner TypUnit (globale Typdefinition, globale Variablen) habe ich Texture definiert.(UTypes)
-Im Form.Create(UMain) erzeuge ich eine Instanz mit Texture.Create.
-In der Zeichenroutine lade ich ein Bild (Texture.loadImage()) ansonsten alles wie vorher.
-Erst im Form.Destroy(UMain) wird Texture wieder freigegeben.

Dies sollte doch zumindest bei 1 Textur gehen, oder :?:

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 10, 2004 13:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
  • Hast du einen gültigen und aktiven Renderkontext wenn du die Textur lädst? Wenn nicht wird die Textur logischerweise nicht an OpenGL übergeben.
  • Das Bild in der Renderprozedur zu laden ist doch reichlich schlecht, denn dann wird es ja jedesmal von der Platte geladen und an OpenGL übergeben wenn deine Szene gerendert wird.
  • Stimmt die Pfadangabe zu deiner Grafik? Wechsel am besten mal vor dem Laden mit ChDir(ExtractFilePath(ParamStr(0))) in das Verzeichnis deiner Anwendung. Ansonsten kanns nämlich sein das du in nem anderen Ordner bist und deine Textur nicht gefunden wird.

Ansonsten hab ich mich schon recht lange von glBmp (also die Grundversion) verabschiedet, da diese besonders im Zusammenhang mit einigen JPGs Probleme gemacht hat.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 10, 2004 13:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Hoppla, da fällt mir noch was auf. Stell mal sicher dass die Bild-Datei auch geladen wird. Denn Du versuchst sie unter "\GFX\..." zu laden. Meintest Du evtl. "..\GFX\..."? Denn wenn Du nur "\" verwendest, wird das GFX-Verzeichnis in der Root deines aktuellen Laufwerkes gesucht.

Wenn Du dich also unter "C:\MyProject\MyGame\Binary" befinden würdest, wird bei '..\GFX\...." das ganze unter "C:\MyProject\MyGame\GFX\.." gesucht, während bei "\GFX\..." versucht wird, die Datei unter "C:\GFX\..." zu laden.

[EDIT:] Ups, SOS war schneller ;)

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 10, 2004 14:04 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Jungs ich habs...Ihr wart prinzipiell auf dem richtigen weg...8)
Also folgendes:
Ich hab den Debugger angeworfen und bemerkt, dass er gar keine Tex lädt. Ich hatte aber bereits eure beiden Tipps angwendet. Also hab ich mir mal die glBMP angeguckt und... Der übergebene Filename muss absolut sein, sonst sucht glBMP von seiner aktuell Position aus nach dem ding. Also hab ich das Laden so gemacht:
Code:
  1. Texture.LoadImage(ExtractFilePath(ParamStr(0))+'GFX\Startbild2.jpg');
und es geht. :D

Aber nochmal auf deinen Kommentar (SOS)...Wieso verwendest du die glBMP net und was verwendet ihr eigentlich für einen Loader. GLAUX nimmt ja auch keiner mehr. Irgendwie habt ihr alle möglichen Loader im SDK aber keiner wird von euch benutzt!?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 10, 2004 14:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich nutze ne von mir sehr stark modifizierte Version von Jan Horns Textures.pas. Die ist zwar in der Originalversion nicht so umfangreich und funktionsgefüllt wie die glBmp.pas, aber daher auch leichter anpassbar. Ausserdem hab ich bei der intensiven Nutzung der glBmp in einem größeren Projekt festgestellt das nicht alle JPGs korrekt geladen wurden, sondern zufällig mal eine Textur nicht ging.
Hab dann halt auf die Textures.pas gewechselt und alles was ich selbst brauch nachgerüstet. Solche Sachen wie Eigenschaften der Texturen (Höhe, Breite, Target, usw.), automatische MipMap-Generation, Texturenkompression. Hab mir dann um die erweiterte Unit herum noch nen feinen Texturenmanager gebastelst, so dass ich da recht bequem arbeiten kann.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 10, 2004 14:25 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also ich hab mich jetzt dazu entschlossen ein Texturenarray einzurichten in welches ich alle benötigten Texturen lege. Damit bin ich in der Lage einmal Zentral alle Texturen zu laden und kann dann auf die entsprechende Tex geziehlt zugreifen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 10, 2004 14:45 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also jetzt passiert etwas total merkwürdiges... Er bricht mit einem Win32 Error beim erstellen des Programms ab und zeigt mir "RaiseLastOSError".
Wenn ich schrittweise durchlaufe beleibt er bei "//<-- Hier" Hengen.
Er führt immer wieder nur das Create aus und springt dann zum ende der Procedure (Er überspringt das eigentliche Laden). Irgendwann kommt dann der Win32 fehler.

Definition meines TexturFeldes (UTypes):
Code:
  1. TTexArray = array[0..10] of TglBMP; // 0 = DummiTex, 1-10 lfd.Nr. des Spielstatus


Begin meiner GrafikUnit (UGFX):
Code:
  1. unit UGFX;
  2.  
  3. interface
  4. uses glBMP, DGLOpenGL, UTypes, Sysutils;
  5.  
  6.      procedure LoadTextures;               // Lädt alle benötigten Texturen nach GVTextures
  7.      procedure ShowStartScreen;            // Zeigt des Intro Bild
  8.      ...
  9.  
  10. implementation
  11.  
  12. procedure LoadTextures;
  13. var Texture : TglBMP;
  14. begin
  15.      Texture.Create;                                   //<-- Hier
  16.      //Intro Bild
  17.        Texture.LoadImage(ExtractFilePath(ParamStr(0))+'\GFX\Startbild2.jpg');
  18.        Texture.GenTexture;
  19.        GVTextures[1]:=Texture;
  20.      //Main Menue
  21.      //Optionen
  22.      //EndScreen
  23.      Texture.Free;
  24. end;
  25. procedure ShowStartScreen;
  26. // Zeigt das Intro Bild
  27. begin
  28.      glBindTexture(GL_TEXTURE_2D,GVTextures[1].TextureID);
  29.      glBegin(GL_QUADS);
  30.          glTexCoord2f(0,0); glVertex3f(-1,-1,0);
  31.          glTexCoord2f(0,1); glVertex3f( 1,-1,0);
  32.          glTexCoord2f(1,1); glVertex3f( 1, 1,0);
  33.          glTexCoord2f(1,0); glVertex3f(-1, 1,0);
  34.      glEnd;
  35. end;
  36. ...


EDIT: Der Taskmanager zeigt weitere Sonderbare sachen:
Kurzzeitig 100% CPU Last (Na OK)
Anstieg der Auslagerungsdatei von 270MB auf 470MB !!! :!:

Also irgendwas is jetzt hier mega Faul....

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Zuletzt geändert von Flash am Mi Mär 10, 2004 14:50, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 10, 2004 14:46 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Es reicht ja schon wenn man eine T(Hashed)StringList nimmt. Da kann man zu jedem String auch noch ein Objekt ablegen. Sowas in der Art ist vielleicht eine flexibelere Lösung an Stelle eines Arrays.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 10, 2004 14:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das hier ist doch total falsch :
Code:
  1. Texture.Create;

und muss so aussehen :
Code:
  1. Texture := TTexture.TglBMP

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 15 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]