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

Aktuelle Zeit: Fr Jul 11, 2025 02:58

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Okt 08, 2007 16:37 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Hi,

hab mal wieder Probleme mit SDL.
Ich will ein Surface erstellen, darauf "malen" und es dann abspeichern.

Code:
  1. surface := SDL_CreateRGBSurface(SDL_SWSURFACE, MapWidth, MapHeight, 24,
  2.                   $000000ff, $0000ff00, $00ff0000, $ff000000);
  3.   p := surface^.pixels;
  4.   // Copy the normals as RGB to the surface
  5.   for x := 0 to MapWidth-1 do
  6.     for y := 0 to MapHeight-1 do
  7.     begin
  8.       p^ := Byte(Round(Normals[x, y].X*255/2+128)); inc(p);
  9.       p^ := Byte(Round(Normals[x, y].Y*255/2+128)); inc(p);
  10.       p^ := Byte(Round(Normals[x, y].Z*255/2+128)); inc(p);
  11.     end;
  12.  
  13.   SDL_SaveBmp(blit, PChar(BMapFile));
  14.   SDL_FreeSurface(surface);
  15.  


Ich bekomme ein schwarzes Bild. Das ich nicht nur schwarze Pixel schreibe habe ich schon kontrolliert.
Wenn ich das surface nochmal zusätzlich blitte, wird das neue Surface auch schwarz, sowohl im File
als auch im Programm - alles Pixel, die ich auslese, haben r, g, b = 0.

Muss ich die Pixel vielleicht noch irgendwie übernehmen?

Gruß

_________________
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 Okt 08, 2007 18:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Probier mal SDL_LockSurface vor und SDL_UnlockSurface nach der Schreibschleife. Könnte helfen, muss aber nicht.

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 Okt 08, 2007 18:52 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Tut es nicht. Hab es auch schon ohne Erfolg mit dieser Methode versucht:
Code:
  1. procedure DrawPixel(screen: PSDL_Surface; x, y: Integer; R, G, B: Byte);
  2. var
  3.   Color: Integer;
  4.   bufp, p: Pointer;
  5. begin
  6.   Color := SDL_MapRGB(screen^.format, R, G, B);
  7.  
  8.   if (SDL_MUSTLOCK(screen)) then
  9.     if ( SDL_LockSurface(screen) < 0 ) then
  10.       exit;
  11.  
  12.   case (screen^.format^.BytesPerPixel) of
  13.     1: begin { vermutlich 8 Bit }
  14.          bufp := Pointer(Integer(screen^.pixels) + y*screen^.pitch + x);
  15.          Byte(bufp^) := color;
  16.        end;
  17.  
  18.     2: begin { vermutlich 15 Bit oder 16 Bit }
  19.          bufp  := Pointer(Integer(screen^.pixels) + y*screen^.pitch div 2 + x);
  20.          Word(bufp^) := color;
  21.        end;
  22.  
  23.     3: begin { langsamer 24-Bit-Modus, selten verwendet }
  24.          bufp := Pointer(Integer(screen^.pixels) + y*screen^.pitch + x * 3);
  25.          if(SDL_BYTEORDER = SDL_LIL_ENDIAN) then
  26.          begin
  27.            p := bufp;
  28.            Byte(p^) := color; inc(p);
  29.            Byte(p^) := color shr 8; inc(p);
  30.            Byte(p^) := color shr 16;
  31.          end else
  32.          begin
  33.            p := bufp;
  34.            Byte(p^) := color shr 16; inc(p);
  35.            Byte(p^) := color shr 8; inc(p);
  36.            Byte(p^) := color;
  37.          end;
  38.        end;
  39.     4: begin { vermutlich 32 Bit }
  40.          bufp := Pointer(Integer(screen^.pixels) + y*screen^.pitch div 4 + x);
  41.          Cardinal(bufp^) := color;
  42.        end;
  43.     end;
  44.  
  45.     if (SDL_MUSTLOCK(screen)) then
  46.       SDL_UnlockSurface(screen);
  47. end;


surface.pixels enthält hinterher ja die Daten, aber sie werden irgendwie nicht übernommen.

_________________
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 Okt 08, 2007 19:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hast du mal überprüft bis zu welchem Zeitpunkt die Werte noch richtig in surface^.pixels stehen bzw. ob sie während dem Zeichnen noch richtig stehen?
Wenn sie noch während dem Zeichnen drin sind, versuch mal direkt nach SDL_UnlockSurface die Funktion SDL_UpdateRect (zugegeben, die doku ist hier auch nicht gerade aufschlussreicht :wink: aber versuch isses wert und es klingt gut) aufzurufen.

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 Okt 08, 2007 19:30 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Die Idee hatte ich auch schon - Bestraft wurde ich dafür mit einer Access Violation.
Die Werte stehen alle richtig nach dem Zeichnen noch drin.
Es wirkt so, als würde .pixels garnicht zum Blitten/Speichern benutzt...

_________________
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: Di Okt 09, 2007 13:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hmm... Das ist interessant. Versuch doch mal, mittels SDL_LoadBMP nen Bild zu laden und das zu Zeichnen und überprüfe 1. welche Werte drin stehen und 2. was passiert wenn du sie dann änderst, vielleicht gibts da ja irgendnen flag, was gesetzt werden muss.

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 Okt 09, 2007 15:50 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Dein Code sollte eigentlich funktionieren und zumindest surface^.pixel sollte einen anderen Wert als 0 haben.
Kann daher keinen Fehler finden.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 09, 2007 18:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
SDL_CreateRGBSurface - SDL Documentation hat geschrieben:
Notes: Sometimes specifying an Alpha mask value could cause strange results. This can be worked around by setting the Amask parameter to 0, but still including the SDL_SRCALPHA flag, and then using SDL_SetAlpha, also with the SDL_SRCALPHA flag.


Versuch mal, vorallem, da du nur 24 bit allokierst, die amask-Value (deinen letzten Hexwert in SDL_CreateRGBSurface) auf 0 zu setzen.

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  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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