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

Aktuelle Zeit: Fr Jul 18, 2025 15:54

Foren-Übersicht » Programmierung » OpenGL
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: glBindTexture zeigt keine Wirkung
BeitragVerfasst: So Apr 30, 2006 18:01 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Hi,

ich hab mal wieder ein Problem (sowas, das im Forum!) ^^.

Und zwar habe ich 3 Klassen:

TWorld
TSurface
TGame

TWorld ist in diesem Fall unter anderem die Texturverwaltung. Das bedeutet, die Klasse hat ein paar Attribute mit dem Typ gluInt, sowie die entsprechenden getter-Methoden:

Code:
  1.  
  2. type
  3.   TWorld=class
  4.     private
  5.       theBackGround: gluint;
  6.  
  7.     public
  8.       function getBackGround(): gluint;
  9.       procedure Load(pWorld: string);
  10.  
  11. end;    
  12.  
  13. implementation
  14.  
  15. function cWorld.getBackGround(): gluint;
  16. begin
  17.   result := theBackGround;
  18. end;
  19.  
  20. procedure cWorld.Load(pWorld: string);
  21. begin
  22.   theWorldName := pWorld;
  23.  
  24.   LoadTexture(GameSettings.getAppDir + 'Worlds' + pWorld + '\BackGround.tga', theBackGround);
  25. end;
  26.  


TSurface verwaltet meine Oberfläche. Hier zeichne ich nun Dinge, die auf die Texturen zurückgreifen, die in der Klasse TWorld gespeichert sind:

Code:
  1.  
  2. procedure cSurface.drawBackGround(pX, pY: real);
  3. begin
  4.   glEnable(GL_TEXTURE_2D);
  5.   glBindTexture(GL_TEXTURE_2D, World.getBackGround);
  6.  
  7.   glLoadIdentity;
  8.   gltranslatef(0, 768, 0);
  9.  
  10. glBegin(GL_QUADS);
  11.  glColor4f(1,1,1,1);
  12.  glTexCoord2f(0,1);       glVertex2f(0, 0);
  13.  glTexCoord2f(1,1);       glVertex2f(1024, 0);
  14.  glTexCoord2f(1,0);       glVertex2f(1024, -768);
  15.  glTexCoord2f(0,0);       glVertex2f(0, -768);
  16. glEnd;
  17.  
  18. end;
  19.  


Ja, und in TGame, dass die Prozedut "Main" beinhaltet, rufe ich die obenstehende drawBackGround Procedure auf.


Das Ergebnis ist, dass zwar das Rechteck gezeichnet wird, aber die Textur nicht zu sehen ist.. Die Textur selber ist kompatibel, denn in einer anderen Anwendung funktioniert sie.

Woran liegt das? Ich habe schon einmal testweise die Textur als Attribute zur Surface hinzugefügt und diese dann auf das Rechteck gebunden (falls das mit der Getter-Methoed nicht funktionieren sollte), funktioniert aber auch nicht..

Hoffe, ihr könnt mir helfen..

Grüße
Passi


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 18:10 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Das gezeichnete Quad ist weiss?

Überprüf mal den Rückgabewert von LoadTexture. Ich denke, dass einfach die Textur nicht richtig geladen wird.

Und was sind das für andere Anwendungen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 18:17 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Quad ist weiß.

LoadTexture gibt True zurück.

Andere Anwedungen: Fast das Selbe, nur ohne Texturmanager, da sind die Texturen direkt als Attribute in den jeweiligen Klassen angegeben.. und da tuts.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 18:25 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Rufst du world.Load vorher auf?
Bzw. gib bzgl. dem mal ein bischen mehr Code. Weil dann kann nur noch dort der Fehler sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 18:28 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Ja, rufe ich auf und zwar im Konstrukor der Steuerung:

Code:
  1.  
  2. procedure cControl.GameMain();
  3. begin
  4.   Surface.drawBackGround(Map.getBackGroundPosX, Map.getBackGroundPosY);
  5. end;
  6.  
  7. constructor cControl.create(pGameSettings: cGameSettings; pPlayer: cPlayer;
  8.                          pMap: cMap; pSurface: cSurface; pWeatherEffect: cParticleEffect; pWorld: cWorld);
  9. begin
  10.   GameSettings := pGameSettings;
  11.   Player := pPlayer;
  12.   Map := pMap;
  13.   Surface := pSurface;
  14.   WeatherEffect := pWeatherEffect;
  15.   World := pWorld;
  16.  
  17.   World.Load('Test');
  18.   Map.Load('Test');
  19.   CenterMapToStartPoint();
  20. end;
  21.  



Mehr Code gibt's eigentlich noch gar nicht, die World Methoden hab ich vollständig reinkopiert..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 18:37 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
pWorld.Create?
Weil es ja eine Klasse ist ;)

Wobei dann ne Exception hageln sollte.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 18:45 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Nein, das sind alles Forward-Deklarationen.

Die Objekte sind in der MainForm schon instanziiert und werden per Übergabeparameter dann an die Steuerung übergeben:

Code:
  1.  
  2. var
  3.   Main: TMain;
  4.   Game: cGame;
  5.   OpenGLUtils: cOpenGLUtils;
  6.   GameSettings: cGameSettings;
  7.   Control: cControl;
  8.   Map: cMap;
  9.   Player: cPlayer;
  10.   World: cWorld;
  11.   GameUtils: cGameUtils;
  12.   Surface: cSurface;
  13.   Weather: cParticleEffect;
  14.  
  15. implementation
  16.  
  17. {$R *.dfm}
  18.  
  19. procedure TMain.FormActivate(Sender: TObject);
  20. begin
  21.   GameSettings := cGameSettings.create;
  22.   Player := cPlayer.Create;
  23.   Map := cMap.Create(GameSettings);
  24.   World := cWorld.create(GameSettings);
  25.   GameUtils := cGameUtils.Create;
  26.   Surface := cSurface.create(World, GameUtils);
  27.   Weather := cParticleEffect.create(GameUtils, GameSettings);
  28.   Control := cControl.create(GameSettings, Player, Map, Surface, Weather, World);
  29.  
  30. end;
  31.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 18:55 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Dann fällt mir spontan ne Kleinigkeit auf:
type
TWorld=class
.
.
.
function cWorld.getBackGround(): gluint;

Ansonsten könntest du theBackGround mal manuell überprüfen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 18:58 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Wie kann ich das machen, manuell überprüfen?

Die Kleinigkeit ist gut beobachtet ^^, habs oben aber nur in TWorld geändert zur besseren Verständnis weil die Delphi Klassen ja normal alle mit T beginnen.. meine aber mit c ^^.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 19:05 
Offline
DGL Member

Registriert: Mi Mär 22, 2006 20:16
Beiträge: 22
Wohnort: Wuppertal
Füg mal das ein nach glBindTexture:
Code:
  1.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  2.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


Von mir aus auch GL_NEAREST oder sonstwas, aber glTexParameter() scheint bei manchen Grafikkarten absolut Pflicht zu sein, bei mir wird nämlich auch alles in weiß angezeigt, wenn ich die Zeilen nicht irgendwo, vorzugsweise nach Bind stehen habe, die ich bei dir auch nicht sehe. (OpenGL-Bug??)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 19:08 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Passi hat geschrieben:
Wie kann ich das machen, manuell überprüfen?

Du gibt beim Laden der Textur den Wert aus und beim Binden der Textur.

Noop hat geschrieben:
Von mir aus auch GL_NEAREST oder sonstwas, aber glTexParameter() scheint bei manchen Grafikkarten absolut Pflicht zu sein, bei mir wird nämlich auch alles in weiß angezeigt, wenn ich die Zeilen nicht irgendwo, vorzugsweise nach Bind stehen habe, die ich bei dir auch nicht sehe. (OpenGL-Bug??)

Er benutzt doch schon den Loader von Jan Horn, dort wird es schon gemacht. Und vor dem Bind sollte es auch nicht nötig sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 19:16 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Ja, also glTexParametersi bringt leider auch nichts.

Öhm also auch auf die Gefahr hin mich jetzt zu blamieren.. welchen Wert soll ich ausgeben?

Function LoadTexture: boolean <- hab ich mir ja beim Laden der textur ausgeben lassen, ist true

aber BindTextur ist ja ne Procedure..?


glGetError gibt übrigens auch 0 aus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 19:37 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
theBackGround, ist ja einfach ein Cardinal.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 22:35 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Ich weiß jetzt woran es liegt...

der LoadTexture Befehl muss in der Form-Klasse aufgerufen werden, warum auch immer..

D.h. wenn ich in FormActivate z.B. die Textur lade funktioniert es..

Woran liegt das? Wie kann ich das ändern? Ich würd die Texturen schon gerne innerhalb der entsprechenden Klassen laden..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 01, 2006 09:54 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Argh, ich Dösel :roll:


Ich hab die Texturen geladen bevor OpenGL Initialisiert war....

-> Hat sich erledigt!

Danke für eure Hilfe!


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 » OpenGL


Wer ist online?

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