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

Aktuelle Zeit: Di Jul 08, 2025 16:28

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 19, 2007 09:29 
Offline
DGL Member

Registriert: Mi Mär 28, 2007 17:45
Beiträge: 131
Kyro hat geschrieben:
Hast du ein 64bit-OS?
Schau mal nach, ob du auf surface.pixels zugreifen kannst (z.B einfach mal ein byte auslesen)


Das würde ich grundsätzlich empfehlen, am besten mit einem Bild, das in der Ecke einige definierte Farbpunkte hat. Die ersten 4 oder 8 byte lassen erkennen, ob man das Bild überhaupt an der richtigen Ecke anpackt. Ich habe vor einiger Zeit unter Linux ein C-Programm so umgeschrieben, dass es über SDL_Image PNG-Bilder laden kann. Da hatte ich's am Anfang ebenfalls nur weiß. Nach und nach habe ich mich dann herangearbeitet (durch Untersuchung der Pixelstruktur), bis es zuverlässig funktionierte. Wenn du willst, kann ich den Code hier posten, aber ungefragt möchte ich keine 80 oder 100 Zeilen aufdrängen.

BTW: Ich glaub zwar nicht, dass es daran liegt, aber um nichts unversucht zu lassen: SDL empfiehlt, das Surface vor dem Zugriff bei Bedarf zu sperren. SDL_MUSTLOCK, SDL_Locksurface usw.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 19, 2007 12:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hm, die idee mit dem Locken kann durchaus sinnvoll sein, da das Problem wie ich es habe durchaus durch gleichzeitigen Zugriff erfolgen könnte (obwohl ich zu dem Zeitpunkt nur einen Thread laufen habe und das ist die Hauptanwendung). Gerade kann ich zwar an ne IDE, aber ich hab nicht sonderlich viel Zeit, heb ich mir für heute Nachmittag auf.

Deine Codezeilen nehme ich gerne, aber es wäre verwunderlich, wenn er die Daten unter Linux komplett anders abspeichern würde, trotzdem häng sie mal an.

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: Mi Sep 19, 2007 13:09 
Offline
DGL Member

Registriert: Mi Mär 28, 2007 17:45
Beiträge: 131
Ok, hier der Code. Ich hab einiges herausgeworfen, z.B. die Sicherheitsabfragen. Das Umspeichern in den Puffer ist notwendig, weil das Programm auch andere Methoden als SDL_Image verwendet. TImage normiert das Ganze. Außerdem wird TImage nicht nur für Texturen gebraucht, sondern auch für Heightmaps usw.

Code:
  1.  
  2. // Struktur, die unabhängig vom Grafikformat alle
  3. // benötigten Daten des Bildes enthält:
  4.  
  5. typedef struct
  6. {
  7.     unsigned short sizeX;  // Breite
  8.     unsigned short sizeY;  // Höhe
  9.     unsigned short sizeZ;  // Farbtiefe
  10.     unsigned short pitch;  // Zeilenlänge
  11.     unsigned char  *data;   // Zeiger auf Pixeldaten
  12. } TImage;
  13.  
  14.  
  15. // ------------------------------------------------------------
  16. TImage *ImageLoad (char *filename)
  17.  
  18. // ImageLoad legt dynamisch eine TImage-Struktur an,
  19. // lädt das Bild hinein und liefert einen Zeiger
  20. // auf die Struktur zurück
  21.  
  22.     TImage *final;
  23.     SDL_Surface* sdlImage;
  24.     int x, y;
  25.     unsigned char *sdldata;
  26.  
  27.    
  28. #if defined (HAVE_SDL)  // compilieren, falls SDL vorhanden
  29.     sdlImage = IMG_Load (filename);
  30.  
  31.     final = (TImage *) malloc (sizeof (TImage));   // Speicher für die TImage-Struktur allokieren:
  32.    
  33. // Grafikparameter übertragen:
  34.     final->sizeX = sdlImage->w;
  35.     final->sizeY = sdlImage->h;
  36.     final->sizeZ = sdlImage->format->BytesPerPixel;
  37.     final->pitch = sdlImage->pitch;
  38.    
  39. // Speicher für die Pixeldaten allokieren:
  40.     final->data = (unsigned char *) malloc (final->pitch * final->sizeY * sizeof (unsigned char));
  41.  
  42. // SDL-Surface sperren, falls erforderlich
  43.     if (SDL_MUSTLOCK(sdlImage)) {
  44.         if (SDL_LockSurface (sdlImage) < 0) return NULL;
  45.     }
  46.  
  47. // Pixeldaten in die Struktur schaufeln, hier vertikal gespiegelt:
  48.     sdldata = sdlImage->pixels;
  49.     for (y=0; y <final->sizeY; y++) {
  50.         for (x=0; x < final->pitch; x++) {
  51.             final->data [y * final->pitch + x] = sdldata[(final->sizeY-1-y) * final->pitch + x];   
  52.         }
  53.     }
  54.  
  55. // SDL-Surface wieder aufschließen und frei geben
  56.     if (SDL_MUSTLOCK (sdlImage)) SDL_UnlockSurface (sdlImage);
  57.     SDL_FreeSurface (sdlImage);
  58.    
  59. // Rückgabewert: Zeiger auf TImage-Struktur
  60.     return final;
  61.  
  62. #else
  63.    // ohne SDL auskommen, andere Methoden
  64. #endif
  65. }
  66.  
  67. // ------------------------------------------------------------
  68. GLuint  LoadTexture (char *filename)
  69. {
  70.     TImage *texImage;
  71.     GLuint texid;
  72.    
  73. // Image laden und Zeiger auf TImage-Struktur holen:   
  74.     texImage = ImageLoad (filename);
  75.  
  76.     glGenTextures (1, &texid);
  77.     glBindTexture (GL_TEXTURE_2D, texid);      
  78.     glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
  79.  
  80.     glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  81.     glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  82.  
  83. // bei sizeZ = 3 wird GL_RGB übergeben, sonst GL_RGBA
  84.     gluBuild2DMipmaps (GL_TEXTURE_2D,
  85.                         texImage->sizeZ,
  86.                         texImage->sizeX,
  87.                         texImage->sizeY,
  88.                         texImage->sizeZ == 3 ? GL_RGB : GL_RGBA,
  89.                         GL_UNSIGNED_BYTE,
  90.                         texImage->data);
  91.  
  92.     free (texImage->data);
  93.     free (texImage);
  94.     return texid;    
  95. }
  96.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 19, 2007 11:27 
Offline
DGL Member

Registriert: Mi Mär 28, 2007 17:45
Beiträge: 131
Ich weiß nicht, ob die Sache bei dir inzwischen funktioniert, aber ich habe mich noch mal gründlich damit auseinandergesetzt. Das geht wirklich alles problemlos, noch viel einfacher als in meinem Codebeispiel. Doch ich bin auf einen blöden Fehler gestoßen, der gerade in Testprogrammen schnell passieren kann. Ist es möglich, dass du die Textur geladen hast, bevor SDL initialisiert wurde? Dann bleibt der Bildschirm natürlich leer.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 19, 2007 12:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Erin. Wo du es gerade erwähnst. Ich hatte das Thema letztes Wochenende mal gesucht aber irgendwie nicht gefunden. Ich hatte ein sehr ähnliches Problem gehabt. Konnte alles machen aber sobald ich auf die Pixels eines Surfaces zugreifen wollte habe ich AccessViolations bekommen. Bei einem Code der seit geraumer Zeit problemlos funktionierte.

Die Lösung lag in einer Kompileroption die ich gesetzt hatte. Und zwar benötigt SDL und fast allen Bibliotheken ein Alignment von 4. In dem SDL Header von den JEDIs steht das Alihnment auch drin. Da ich die Funktionen bei mir aber dynamisch lade habe ich mir aber einen eigenen Header geschrieben. Und der unterlag den Einstellungen meines Projektes. Auf jeden Fall. Als ich das Alignment wieder an gestellt hatte ging es dann.

Allerdings ging es bei mir sowohl unter Windows als auch unter Linux nicht. Aber diese Einstellung befindet sich auch im Code und überwiegt somit irgendwelchen Einstellungen im Kompiler/IDE.

PS: Das Gleiche passiert auch wenn man bei dem Record PSDL_surface ein packed hinzufügt. Selbst bei passendem Alignement.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 19, 2007 13:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich hatte den Thread ganz vergessen, aber es lief auch nicht. Ich nutze die JEDI-SDL-Header, daher sollte das Alignment stimmen.

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: Fr Okt 19, 2007 17:46 
Offline
DGL Member

Registriert: Mi Mär 28, 2007 17:45
Beiträge: 131
Wie's unter Windows läuft, weiß ich nicht. Unter Linux habe ich keinerlei Probleme, auch ohne besondere Compilereinstellungen. Vielleicht macht man manches einfach zu kompliziert?

Wenn's interessiert: Ich bin gerade damit fertig geworden, einiges dazu auf meiner Webseite zu beschreiben. Ist zwar alles recht simpel gehalten, aber ich gebrauch's auch für mich, als Gedächtnisstütze, und so wie ich gestrickt bin, muss ich dafür sorgen, dass ich mich selber nach einem Jahr noch verstehen kann. :)

http://www.erinacom.de/ogl/themen/themen.html


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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