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

Aktuelle Zeit: Fr Jul 18, 2025 22:47

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: SDL Texturen funktionieren nicht :-(
BeitragVerfasst: Mo Sep 04, 2006 15:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hi @ll

Ich stehe jetzt schon seit einigen Tagen auf dem sprichwörtlichen Schlauch, ich hab den Code schon mehrfach durchsucht, aber ich finde den Fehler nicht.
Das Problem:
Ich lade die Texturen mit einem eigenen Texturmanager / Loader basierend auf SDL_Image. Dort werden ID's und alles generiert, die Textur geladen und mittels glTexImage2D geuploaded. Allerdings muss ich mich mit einem Texturlosen grau zufriedengeben, obwohl keine Fehler auftreten. Die Textur ist 512x512 Pixel groß, also an der größe dürfte es auch nicht hapern.

Hier ein paar Sourcecodes

1. Texturloader
Code:
  1.  
  2. function TstwEngineTexture.LoadFromSurface(const Surface: PSDL_Surface): Boolean;
  3. var
  4.   SavedFlags: UInt32;
  5.   SavedAlpha: UInt8;
  6.   Area: SDL_Rect;
  7. begin
  8.   Result := False;
  9.   if FImage <> nil then
  10.     SDL_FreeSurface(FImage);
  11.   FImage := SDL_CreateRGBSurface(
  12.       SDL_SWSURFACE,
  13.       Surface.w,
  14.       Surface.h,
  15.       32,
  16.       $000000FF,
  17.       $0000FF00,
  18.       $00FF0000,
  19.       $FF000000
  20.     );
  21.  
  22.   if (FImage = nil) then
  23.   begin
  24.     FEngine.Log.WriteError('Textures', 'LoadFromSurface', 'Couldn''t create SDL-Surface (%s)', [StrPas(SDL_GetError)]);
  25.     Exit;
  26.   end;
  27.  
  28.   SavedFlags := Surface.flags and (SDL_SRCALPHA or SDL_RLEACCELOK);
  29.   SavedAlpha := Surface.format.alpha;
  30.  
  31.   if ((SavedFlags and SDL_SRCALPHA) = SDL_SRCALPHA) then
  32.     SDL_SetAlpha(Surface, 0, 0);
  33.  
  34.   Area.x := 0;
  35.   Area.y := 0;
  36.   Area.w := Surface.w;
  37.   Area.h := Surface.h;
  38.  
  39.   Result := SDL_BlitSurface(Surface, @Area, FImage, @Area) > -1;
  40.  
  41.   if ((SavedFlags and SDL_SRCALPHA) = SDL_SRCALPHA) then
  42.     SDL_SetAlpha(Surface, SavedFlags, SavedAlpha);
  43.  
  44. end;
  45.  
  46. procedure TstwEngineTexture.LoadFromFile(const FileName: String);
  47. var
  48.   Surface: PSDL_Surface;
  49. begin
  50.   if not FileExists(FileName) then
  51.   begin
  52.     FEngine.Log.WriteError('Textures', 'LoadFromFile', 'File doesn''t exists (%s)', [FileName]);
  53.     Exit;
  54.   end;
  55.   Surface := IMG_Load(PChar(FileName));
  56.   if (Surface = nil) then
  57.   begin
  58.     FEngine.Log.WriteError('Textures', 'LoadFromFile', 'Couldn''t load file (%s)', [StrPas(IMG_GetError)]);
  59.     Exit;
  60.   end;
  61.  
  62.   LoadFromSurface(Surface);
  63.   SDL_FreeSurface(Surface);
  64.  
  65.   UploadTexture;
  66. end;
  67.  


2. UploadTexture
Code:
  1.  
  2. function TstwEngineTexture2D.UploadTexture: Boolean;
  3. begin
  4.   FEngine.ClearError;
  5.   Result := False;
  6.   if FImage = nil then
  7.   begin
  8.     FEngine.Log.WriteError('Textures', 'UploadTexture', 'No image loaded', []);
  9.     Exit;
  10.   end;
  11.  
  12.   if FID = 0 then
  13.   begin
  14.     FEngine.Log.WriteError('Textures', 'UploadTexture', 'Texture not generated', []);
  15.     Exit;
  16.   end;
  17.  
  18.   glBindTexture(FTarget, FID);
  19.   glTexImage2D(FTarget, 0, 4, FImage.w, FImage.h, 0, GL_RGBA,
  20.     GL_UNSIGNED_BYTE, FImage.pixels);
  21.   Result := FEngine.Error('Textures', 'UploadTexture') = 0;
  22. end;
  23.  


3. Rendern
Code:
  1.  
  2.         with Engine.TextureByIdentifier['Worldmap'] as TstwEngineTexture2D do
  3.         begin
  4.           glEnable(GL_TEXTURE_2D);
  5.           glBindTexture(GL_TEXTURE_2D, ID);
  6.           glBegin(GL_QUADS);
  7.             glTexCoord2f(0, 0);
  8.             glVertex2f(0, 0);
  9.             glTexCoord2f(0, 1.0);
  10.             glVertex2f(0, 511);
  11.             glTexCoord2f(1.0, 1.0);
  12.             glVertex2f(511, 511);
  13.             glTexCoord2f(1.0, 0);
  14.             glVertex2f(511, 0);
  15.           glEnd;
  16.         end;
  17.  


4. Initialisieren der Texturen
Code:
  1.  
  2.   LogLn('Initializing Engine...');
  3.   Engine := TstwEngine.Create;
  4.   LogLn('Setting up sound variables...');
  5.   Engine.Log.WirteDirect := True;          
  6.   LogLn('Preparing textures...');
  7.   Engine.TextureByIndex[Engine.CreateTexture2D('Worldmap')].GenTexture;
  8.   with (Engine.TextureByIdentifier['Worldmap'] as TstwEngineTexture2D) do
  9.   begin
  10.     LoadFromFile(AppPath + 'gfx\worldmap_1.jpg');
  11.   end;
  12.   {...}
  13.  


Ich find den Fehler nicht, falls noch mehr Source benötigt wird, kann ich gerne noch was rausrücken.

Gruß, ein verzweifelter Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Sep 04, 2006 16:28 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Das einzige was mir gross aufgefallen ist war das: SDL_RLEACCELOK als Flag.
Ansonsten könntest du temporär das Blitten in eine Extrasurface weglassen, da dies nur bei 8-Bit-Surfaces richtig zu empfehlen ist.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 04, 2006 17:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das Blitten mache ich, damit das übergeben an OpenGL immer mit dem Farbformat GL_RGBA geht, für den Fall, dass ich z.B. mal eine ABGR-Textur habe. Und das SDL_RLEACCELOK habe ich auch erst zum testen hinzugefügt, das hatte ich aus dem Textausgabe-mit-SDL-Tut.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 05, 2006 08:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich denke das Problem liegt nicht an SDL. Was setzt du denn eigentlich für Filterungen bei deiner Textur? Setzt du überhaupt eine?

Wenn du zum Beispiel als Minfilter GL_LINEAR_MIPMAP_LINEAR angegeben hast und du aber keine MipMaps erzeugen lässt, dann streikt OpenGL. Bzw wenn du gar keine Filterung angegeben hast benutzt der Treiber einen Standardmodus. Optimiert auf Geschwindigkeit und aussehen dürfte das auch GL_LINEAR_MIPMAP_LINEAR sein.

Ach ja. Resultierend aus den fehlenden MipMaps stellt OpenGL natürlich keine Textur dar.

Du hast jetzt 2 Möglichkeiten.
1. Du setzt einen Filter der keine MipMaps vorraussetzt. Also GL_LINEAR

oder

2. du lässt OpenGL MipMaps erzeugen. Ich bin faul deswegen hier nur ein Stück Code aus meiner glBitmap.
Code:
  1.     if (GL_VERSION_1_4 or GL_SGIS_generate_mipmap)
  2.       then glTexParameteri(Target, GL_GENERATE_MIPMAP, GL_TRUE)


PS: Bevor sich jemand wundert. Die "Möglichkeit" mit gluBuild2DMipmaps MipMaps zu erzeugen habe ich bewusst rausgelassen, da das Heutzutage keine Möglichkeit mehr sein sollte.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 05, 2006 15:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
*duck*

War klar, das ich das mal wieder übersehen musste. Aber dennoch danke, dass ihr mir trotzdem geholfen habt. Mein Threadtitel kommt davon, dass bis jetzt immer Texturen funktioniert haben, aber nie mit SDL.
Jetzt gehts. *freu*

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.008s | 14 Queries | GZIP : On ]