- 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:
Texture.Free;
glDisable(GL_TEXTURE_2D);
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?
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
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?
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
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.
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?
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:
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
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.
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
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:
TTexArray =array[0..10]of TglBMP;// 0 = DummiTex, 1-10 lfd.Nr. des Spielstatus
Begin meiner GrafikUnit (UGFX):
Code:
unit UGFX;
interface
uses glBMP, DGLOpenGL, UTypes, Sysutils;
procedure LoadTextures;// Lädt alle benötigten Texturen nach GVTextures
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.
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.