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

Aktuelle Zeit: Fr Jul 18, 2025 11:07

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



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: SDL TGA richtig laden
BeitragVerfasst: Do Jun 14, 2007 16:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 29, 2005 21:11
Beiträge: 88
Wohnort: Bonn
Moin!

Ich traue mich fast nicht, zu fragen, weil ich der Überzeugung bin, dass ich nur eine winzigkeit übersehen habe...
Also ich habe bis jetzt alle Texturen in Bitmaps gehabt, wollte aber nun auf TGA umsteigen, wegen der kompression.
Und weil der Alphakanal direkt in der Textur wäre...
Jetzt werden allerdings die Farben wirr wiedergegeben. Ich denke, dass liegt daran, dass TGA in BGR statt RGB gespeichert ist - hab ich zumindest so gelesen...
Wie bring ich es denn jetzt fertig, dass dem SDL-Programm mitzuteilen?
Oder ist es überhaupt sinnvoll, mit TGA zu arbeiten?

Achja: Versucht habe ich, im Pixelformat der Textur die Werte von RShift, GShift und BShift zu ändern - das hat die Farbwiedergabe zwar verändert, aber es wurde eher noch wirrer, als besser :(

vielen Dank!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 14, 2007 22:54 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Du sagst OpenGL bei Erstellung der Textur: GL_BGRA anstatt GL_RGBA. Setzt war OpenGL 1.3 oder so voraus, sollte aber da sein. Ansonsten könntest du natürlich manuell eine Farbvertausch machen, da musst du aber Pixel schieben und nicht die Shiftwerte ändern.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 15, 2007 08:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 29, 2005 21:11
Beiträge: 88
Wohnort: Bonn
ich habe vergessen zu erwähnen, dass es ne sdl-only anwendung ist, also ich nutze gar kein opengl...

macht das überahupt sinn, mit .tga? oder gibts noch ne bessere verlustfreie kompression? den alpha kanal kann ich ja direkt in sdl machen...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 15, 2007 10:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also es gibt zum Beispiel noch PNGs. Von der Größer her sind die kleiner und können auch einen richtigen Alphakanal halten.

Schau dir mal die Methode SDL_ConvertSurface an. Bei meinen Font mache ich zum Beispiel folgendes.

Code:
  1. var
  2.   Surface, ConvSurface: PSDL_Surface;
  3.   Format: TSDL_PixelFormat;
  4. begin
  5.   Surface := IMG_Load(FileName);
  6.  
  7.   if Surface <> nil then
  8.     try
  9.       FillChar(Format, SizeOf(TSDL_PixelFormat), 0);
  10.       Format.BitsPerPixel := 32;
  11.       Format.BytesPerPixel := 4;
  12.       Format.RMask := $000000FF;
  13.       Format.GMask := $0000FF00;
  14.       Format.BMask := $00FF0000;
  15.       Format.AMask := $FF000000;
  16.       Format.Rshift :=  0;
  17.       Format.Gshift :=  8;
  18.       Format.Bshift := 16;
  19.       Format.Ashift := 24;
  20.  
  21.       ConvSurface := SDL_ConvertSurface(Surface, @Format, SDL_SWSURFACE);
  22.       if ConvSurface <> nil then
  23.         // Mach was
  24.     finally
  25.       SDL_FreeSurface(Surface);
  26.     end;
  27.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 15, 2007 11:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 29, 2005 21:11
Beiträge: 88
Wohnort: Bonn
ich hab deinen quelltext so übernommen

Code:
  1.  
  2.   tmptex := IMG_Load(PChar(GameDir + 'texturen/' + tmp + '.png'));
  3.   with convformat do
  4.   begin
  5.     BitsPerPixel := 32;
  6.     BytesPerPixel := 4;
  7.     RMask := $000000FF;
  8.     GMask := $0000FF00;
  9.     BMask := $00FF0000;
  10.     AMask := $FF000000;
  11.     RShift := 0;
  12.     GShift := 8;
  13.     BShift := 16;
  14.     AShift := 24;
  15.   end;
  16.   textur := SDL_ConvertSurface(tmptex, @convformat, SDL_SWSURFACE);
  17.  


aber das gibt immernoch wirre farben. mit der position der FF habe ich rumgespielt, aber da tut sich auch nur wenig...

edit:
ich hab gerade gemerkt, dass die verrückten farben an der transparenz liegen, die ich dem png in gimp verpasse, wenn ich ein png ohne transparenz nehme wird alles farbgetreu wiedergegeben... allerdings greift die transparenz in sdl nicht mehr - das ging bisher bei mir so:
SDL_SetColorKey(textur, SDL_SRCCOLORKEY, SDL_MapRGB(textur.format, 0, 0, 0));


Zuletzt geändert von doppelreim am Fr Jun 15, 2007 11:58, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 15, 2007 11:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Was verstehst du denn unter wirren Farben? Häng mal bitte einen Bild dran wo man das sehen kann. Ein kleiner Ausschnitt davon sollte reichen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 15, 2007 12:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 29, 2005 21:11
Beiträge: 88
Wohnort: Bonn
das hier finde ich wirr, aber wie oben im edit schon geschrieben, liegt es wohl an der transparenz im png

wo der char steht ist normalerweise wiese umrahmt mit baumstümpfen

edit: SetColorKey funkioniert doch - oh mann, ich glaub ich geh mal lieber ne runde spazieren :shock:


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 15, 2007 13:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Die Farben sind jetzt aber trotzdem noch komisch, oder? Das kann ich gerade so nicht mehr richtig raus lesen. ;)

Aber die Farben auf dem Bild sind in der Tat seltsam. Vor allem handelt es sich dabei auch nicht nur um eine reine Kanalverwechslung. Die Farben sind so extrem intensiv. Und da kann ich mir nicht vorstellen, dass das Original auch so ist.

Du kannst ja testweise direkt nach dem Laden mal die Bilder als BMP irgendwohin speichern und schauen ob das so aussieht wie es sein sollte bzw auch mal nach den einzelnen Schritten. Also auch nach SetColorKey.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 15, 2007 13:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 29, 2005 21:11
Beiträge: 88
Wohnort: Bonn
war ein bisschen draußen und habe essen gekauft, jetzt bin ich wieder fit 8)

ich lade jetzt png texturen ganz normal über IMG_Load und alles funktioniert bestens.
also farben werden korrekt angezeigt, ohne dass ich mir über RGB und BGR Gedanken mache
und mit SDL_SetColorKey bekomm ich das schwarz aus dem hintergrund der textur auch transparent

die wirren farben kommen, wenn ich das png direkt in gimp transparent mache, aber dann sieht das gespeicherte bild so schon so wirr aus, da kann ja SDL nichts mehr dafür, wenn es wirre sachen wirr anzeigt.
wahrscheinlich gebe ich gimp schon wirre anweisungen für die transparenz und gimp kann dann nicht anders, als wirre farben auszugeben, die sdl dann natürlich wirr wiedergibt...

aber es gibt ja das SetColorKey von SDL, also hat es mit der wirrerei ein ende

Noch eine Frage: manche von den Tiles werfen Schatten - kann ich der "Schattenfarbe" halbe Tranparenz zuschreiben?
Ich häng das Tileset mal an...


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 15, 2007 14:49 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Ja, Transparenz ist schon lange keine Maske mehr sondern ein eigener Farbkanal. Daher kannst du Werte von 0 bis 255 zuweisen.
Die Schatten bekommen einfach 127, das Schwarze 256 und der Rest 0.
Beim Blitten in die Mainsurface sollte SDL das automatisch berücksichtigen, sogar ohne SetColorkey. Das einzige Problem damals war das die Transparents dann verloren geht. Aber an der Stelle ist es für dich ja auch wieder egal.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 15, 2007 15:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 29, 2005 21:11
Beiträge: 88
Wohnort: Bonn
das klingt ziemlich genau nach dem, was ich suche...
aber in der sdl dokumentation finde ich nur set_alpha und das bezieht sich, soweit ich das verstanden habe, immer auf das gesamte surface...
wie setze ich denn alpha werte für einzelne farben?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 15, 2007 15:53 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Das machst du mit deinem Grafikprogramm. Meistens nur indirekt indem du die Deckkraft reduzierst. Danach lädst du die entstandene PNG einfach mit SDL und schon stimmen die Werte. Ansonsten kannst du natürlich auch die Pixel deiner Surface manuell durchgehen und bei Schwarz ohne Alpha dein Alpha auf 127 setzen, aber dies ist Schwachsinn und aufwendig.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 15, 2007 15:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 29, 2005 21:11
Beiträge: 88
Wohnort: Bonn
ach-so :o
ich war immer noch auf der schiene, dass das in sdl geht - sowas wie SDL_SetColorTransparency(surface, color, opacity) oder so
wunderbar, dann geh ich mal den gimp bemühen

viele Dank!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 15, 2007 16:16 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Nein, die einzige Funktion die SDL da zur Verfügung stellt dient dem Zweck eine Farbe als Transparent zu setzen und der Grund dafür ist etwas älter.

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


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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 | 15 Queries | GZIP : On ]