Autor Beitrag
Knappe Franz
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 22.01.08 01:35 
Hey Leute,

ich sitze an einem Info-Projekt. Im Moment bin ich dabei das Spielfeld zu gestalten. Es ist ein Rechteck bestehend aus 36*29 Quads, die ich mit 2 For-to-do-Schleifen zeichnen lasse. Jetzt will ich jedem Feld eine spezielle Textur zuweisen (Wiese, Weg,...). Ich hab mir dazu alles zum Texturen laden und verwenden durchgelesen, was ich so im DGL-Wiki gefunden hab und kann auch problemlos EINE Textur ins Programm laden und auf den Quads anzeigen lassen. Ich habe mich strikt an die Anweisungen wie sie bei GLBitmap-Loader stehen gehalten.
Jetzt habe ich allerdings versucht in Abhängigkeit eines Parameters eben auf eine Art Quads die Wiesentextur zu laden und auf die andere Art die Wegetextur. Allerdings hat das nicht geklappt.

Kann mich nun bitte jemand aufklären, ob ich in dieser Instanz:

var fTexture: TglBitmap2D; // Instanz unserer Textur

auch mehrere Texturen laden und unabhängig abrufen kann oder ob ich mir ein Array dieser Instanz oder sowas in der Art anschaffen muss um jede Textur einzeln zu behandeln? Und warum reagieren die fTexture.Bind; -Befehle nicht, wenn ich mehrere Texturen auf die letztgenannte Art lade?

Danke für eure Hilfe und Gute Nacht!

Knappe Franz
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Di 22.01.08 10:02 
Nein. Du kannst in eine Instanz der Klasse TglBitmap2D nur eine einzige Textur laden. Da bin ich mir ziemlich sicher. ;)

Das ist aber auch nicht unbedingt der typische Anwednungsfall in OpenGL. Du hast in OpenGL normal mehrere Texturen und je nachdem welche du gerade benutzen möchtest bindest du die entsprechende Textur. Und genau so verhält sich das auch mit der TglBitmap2D. Wenn du 3 unterschiedliche Texturen haben möchtest benötigst du auch 3 eigenständige Instanzen der Klasse TglBitmap2D. Und das Laden bitte nach dem Initialisieren von OpenGL. Nicht zwischendurch beim Zeichnen.

ausblenden Definition
1:
  fTextures: array[0..2of TglBitmap2D;					

ausblenden Texturen laden
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  fTextures[0] := TglBitmap2D.Create;
  fTextures[0].LoadFromFile(...);
  fTextures[0].GenTexture();

  fTextures[1] := TglBitmap2D.Create;
  fTextures[1].LoadFromFile(...);
  fTextures[1].GenTexture();

  fTextures[2] := TglBitmap2D.Create;
  fTextures[2].LoadFromFile(...);
  fTextures[2].GenTexture();


In deinem Spielfeld bräuchtest du jetzt nur noch Bezug auf den Index des Textur Arrays nehmen und zeichnen.
ausblenden Zeichnen
1:
2:
  fTextures[SpielFeld[X, Y].TextureIdx].Bind;
  // Quad Zeichnen

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Knappe Franz Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 22.01.08 15:27 
Danke erstmal für die Antwort! Ich hatte genau das schon probiert gehabt. Leider hat es nicht funktioniert. Er hat trotzdem immer nur die Textur angezeigt, die ich als letztes hochgeladen habe. Und scheinbar ignoriert er meine Bind-Befehle beim zeichnen komplett...

Kann es daran liegen, dass ich glenable(GL_TEXTURE_2D); oder ähnliches falsch positioniert habe? Oder muss ich die Texturen an einer anderen bestimmten Stelle hochladen?
Einloggen, um Attachments anzusehen!
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Di 22.01.08 16:02 
Ja du hast Recht. Dein Bind wird ignoriert. Denn zwischen glBegin und glEnd darf so etwas nicht gemacht werden. Wie viele viele andere Operationen auch. Wenn du deine Textur davor bindest sollte alles klar gehen.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Knappe Franz Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 22.01.08 23:27 
Super!! Es funktioniert! Danke dir - und das der Fehler so simpel war freut mich natürlich umso mehr^^