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

Aktuelle Zeit: Fr Jul 18, 2025 08:57

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: SDL Surfaces mit SDL_Image ?!
BeitragVerfasst: So Sep 09, 2007 12:03 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Ich werd hier noch verrückt!

Ich habe jetzt endlich angefangen, mich mit SDL zu beschäftigen, und stehe gleich vorm ersten Problem!
Ich versuche, mittels SDL_Image ein Bild zu laden und als Texture zu verwenden. Ein oft schon hier angehandeltes Thema, aber ich glaub, ich hab ganz andere Probleme! Ich kann .pixels nicht auslesen!

Erstmal etwas Code:
Code:
  1. procedure LoadTexture(FileName: String; var Texture: TGLUInt);
  2. var
  3.    sdl_surface, conv: PSDL_Surface;
  4.    x, y: Integer;
  5.    Buffer: Pointer;
  6. begin
  7.   sdl_surface := Img_Load(PChar(FileName));
  8.   // Speichern geht problemlos, selbst TGA's! (s.u.)
  9.   SDL_SaveBMP(sdl_surface, '/home/swagner/Desktop/sdlout.bmp');
  10.   // geht sowohl mit als auch ohne Blitten nicht
  11.   conv := SDL_CreateRGBSurface(
  12.          SDL_SWSURFACE, sdl_surface^.pitch, sdl_surface^.h, 32,
  13.          $000000ff, $0000ff00, $00ff0000, $ff000000);
  14.   SDL_BlitSurface(sdl_surface, 0, conv, 0);
  15.   // Selbes Bild wie oben (logisch)
  16.   SDL_SaveBMP(sdl_surface, '/home/swagner/Desktop/sdloutblitt.bmp');
  17.   // z.B 1536
  18.   WriteLn(Int64(sdl_surface^.pixels));
  19.   // z.B 137438955072, kleiner Unterschied gefällig?
  20.   WriteLn(Int64(MainForm.DisplaySurface^.pixels));
  21.  
  22.   // Wenn ich versuche, ein TGA zu laden, bekomme ich diesen Fehler:
  23.   // Failed loading DPMSDisable: /usr/lib/libX11.so.6: undefined symbol: DPMSDisable
  24.   // Nach meinen Recherchen hängt das mit dem Lesen von TrueTypeFonts zusammen ?!
  25.   // Habe die komplette SDL sowie ttf-freefont neu installiert, ohne Besserung
  26.   WriteLn(String(IMG_GetError()));
  27.  
  28.   if Assigned(sdl_surface) then
  29.   begin
  30.    // In einen eigenen Buffer schreiben bringt auch nichts
  31.    //Buffer := AllocMem(sdl_surface^.pitch * sdl_surface^.h);
  32.    //Move(sdl_surface^.pixels^, Buffer^, sdl_surface^.pitch * sdl_surface^.h);
  33.    WriteLn('Load');
  34.    glGenTextures(1, @Texture);
  35.    glBindTexture(GL_TEXTURE_2D, Texture);
  36.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  37.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  38.    // mit sdl_surface^.w statt sdl_surface^.pitch gibts keine Exception - kein Wunder, dann wird ja auch nichts gelesen
  39.    // da w = 0!
  40.    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sdl_surface^.pitch, sdl_surface^.h, 0,
  41.                            GL_RGBA, GL_UNSIGNED_BYTE, sdl_surface^.pixels);
  42.    //WriteLn(sdl_surface^.pixels);
  43.    // pitch liefert den korrekten Wert, 512
  44.    WriteLn('Width: ' + IntToStr(sdl_surface^.pitch));
  45.    // h ist richtig (512)
  46.    WriteLn('Height: ' + IntToStr(sdl_surface^.h));
  47.    SDL_FreeSurface(sdl_surface);
  48.    SDL_FreeSurface(conv);
  49.    // no error, wenn er soweit kommt und nicht vorher rausfliegt
  50.    WriteLn(gluErrorString(glGetError()));
  51.   end;
  52. end;


Da stell ich mir die eine Frage:
Warum kann SDL mit meinem SDL_Image Surface umgehen (Speichern, Blitten) und ich nicht? Ich hatte schonmal die Idee, TSDL_Surface als packed record zu definieren - immerhin ist SDL in C geschrieben und eventuell liegt das Surface anders im Speicher, aber Fehlanzeige. Dagegen spricht auch, dass das Surface der Form ja korrekt zu sein scheint (immerhin zeigt pixels nicht irgendwo an den Anfang des Speichers...).

Ich habs dann auch mal mit easySDLTextures probiert (nachdem ich sdlutils 64bit-tauglich gemacht habe), mit der gehts auch nicht.

Jemand ne Idee? Ich lauf hier nämlich bald Amok...
Gruß

edit: Mir ist grad noch ein Fünkchen Hoffnung aufgegangen, als ich gesehn hab, dass ich garnicht das geblittete Surface benutze (*peinlich*) - nichts desto trotz ist hier alles gleich: pixels zeigt in einen ähnlichen Speicherbereich. Wenn ich nur die Surface erstelle (CreateRGBSurface), dann kann ich ein schwarzes Bild speichern (auch logisch).

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Zuletzt geändert von Kyro am So Sep 09, 2007 12:15, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 09, 2007 12:09 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Du bist unter einem 64-Bit OS?
Dann würde ich an der Stelle mal den Header mit dem C-Header vergleichen und schauen ob nicht eine Variable mit falscher Länge definiert wurde.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 09, 2007 15:33 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Ja bin ich.

Den Header hab ich mir angeguckt, der is so "1:1" vom C-Header übernommen.
Da snd die Fehler denke ich auch nicht zu suchen. Irgendwo schreibt SDL selbst ins Nichts, warscheinlich durch irgendwelches (rück-)konvertieren von Pointern - woher weiß ich das? Die Fehler sind unberechenbar. Binde ich zum Beispiel das normale GL und GLU ein, dann wird das Surface initialisiert, bind ich dglOpenGL ein, dann nichtmehr. Außerdem spielt meine Konsole kurz verrückt! Ich frag mich echt, ob gerade bei solchen Projekten nicht mal einer ne 64bit Kiste hat. Und sowas nennt sich dann Platform-Independent...

Ich werd mal die Demos testen.

Ich hab langsam keine Lust mehr auf den 64bit Mist - Man muss sich überall Workarounds und was weiß ich was machen, nichts funktioniert wie es soll. Da fragt man sich echt, wozu der Sch**** gut sein soll.... Nur mal meine Meinung sry für die Ausdrucksweise.

edit: Oder es liegt doch nur am Header, ein OGL-Beispiel mit Texturen in C geht nämlich. Aber jetzt 5000 Zeilen Code durchsehen? naja...

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 10, 2007 18:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das Problem kommt mir verdammt bekannt vor!
Ich hatte doch vorkurzem ein ähnliches Problem. Wenn du den Compiler allerdings auf i386 umstellst, dann läuft es - abgesehen davon, dass deine Surface vermutlich nicht bei OpenGL ankommt, wenn du das gleiche "glück" hast wie ich.
Probier das doch mal aus, vielleicht können wir da unsere Erfahrungen irgendwie zusammenbringen. Ich suche immernoch nach einer Lösung.

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: Mo Sep 10, 2007 23:41 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Würde ich gerne tun aber... ich hab mir mittlerweile aus Frust vor dem ganzen 64bit gedöns ein 32bit-OS draufgemacht, und hier geht alles einwandfrei und das ist gut so...

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 11, 2008 12:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 01, 2006 08:22
Beiträge: 26
Wohnort: Frauenfeld / CH
Weiss nicht wie aktuell das Problem noch ist, aber bei mir scheint das verwenden aktueller SDL Header (Jedi, RC2 vom Februar 08 ) geholfen zu haben.


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 4 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.008s | 15 Queries | GZIP : On ]