Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

1

02.01.2007, 11:27

Problem mit TGA

Hallo,
ich habe gestern einen Loader für (vorerst unkomprimierte) TGAs programmiert. Zurzeit zeichne ich die Texturen dann noch über ein ID3DXSprite, denn ich wollte erstmal nur die D3DXCreateTextureFromFile Funktion ersetzen.
Das klappt alles schon ziemlich gut, allerdings wird das Bild irgendwie verkehrt herum ausgegeben (links die Ausgabe und rechts das Original): http://img219.imageshack.us/img219/8418/fehlervv6.png
Wie ist eine TGA-Datei denn aufgebaut? Nach meinen Nachforschungen sind die Pixel selbst in der richtigen Reihenfolge, nur innerhalb der Pixel sind die einzelnen Kanäle umgedreht oder?

Das nächste Problem hat weniger mit Direct3D zu tun. Jedenfalls hatte ich meine Grafiken ursprünglich im PNG-Format mit Alphakanal vorliegen. Wenn ich die jetzt mit Photoshop nach TGA konvertiere (32Bit, ohne Kompression), sind die Alphastellen mit weiß ausgefüllt und werden folglich im Programm auch weiß ausgegeben...

Es wär super, wenn ihr mir da weiterhelfen könntet :)

ph4nt0m

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

02.01.2007, 11:51

tga ist per default afaik bottom up, also ist die erste scanline in der datei die unterste im bild ;)

aber es gibt da afaik dieses xstart/ystart zeug im tga header, ich glaub mit dem kann man das festlegen...

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

3

02.01.2007, 14:16

Jo, das würde sich mit dem, was ich soweit erkenne, decken. :) Aber: In welcher Reihenfolge muss man denn die Kanäle der einzelnen Pixel in die Textur laden? Im TGA original sind sie so angeordnet: BGRA
Wenn ich jetzt gar nichts mache, sondern einfach die Daten 1:1 in die Textur lade, dann ist das Bild wie gesagt falsch herum, aber die Farben selbst sind richtig. Kann ich daraus schließen, dass ich die Farben für die Textur vorher nicht nach ARGB umdrehen muss, sondern im BGRA Format lassen kann?

ph4nt0m

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

02.01.2007, 14:21

http://de.wikipedia.org/wiki/Little_endian ;)

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

5

02.01.2007, 14:28

Sieht so aus, als wenn das Format mehr oder weniger Standard wäre. Also wirds in der IDirect3dTexture9 wohl auch so gespeichert.

Ich hab jetzt versucht, das Bild zu drehen, also besser gesagt, die Reihenfolge der einzelnen Bildzeilen umzudrehen. Das eigentliche Bild ist jetzt auch richtig, aber die Farben haben sich irgendwie völlig vertauscht: Da, wo Rot sein müsste, ist plötzlich Blau, und da, wo Grün war, ist es jetzt durchsichtig :shock:

Woran kann das denn liegen? Ich hab doch nur die Zeilen für sich verschoben, aber innerhalb der Zeilen müsste die Reihenfolge der Farben doch gleichgeblieben sein!?

ph4nt0m

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

02.01.2007, 15:07

wie genau hast du die "zeilen verschoben"?
zeig evtl. den codeteil der dir die pixelwerte aus der datei in die textur schaufelt (hab da so eine vermutung die sich pitch nennt...)

beim 32 bit ARGB format schaut ein pixel als dword so aus:

0xAARRGGBB

da wir mit dem PC aber eine little endian maschine haben, schaut der pixel im speicher (und auch, wenn er als dword in eine datei geschrieben wird) so aus:

BB GG RR AA

;)

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

7

02.01.2007, 15:26

Oh, tut mir leid, ich habe den Fehler schon alleine entdeckt: Ich habe zwei Zeiger erstellt, einen auf den Anfang der Textur und einen weiteren auf die letzte Zeile des Bildspeichers. Dabei lief die Positionierung des zweiten Zeigers etwas schief:

Bildspeicheranfang + Bildgröße - Zeilengröße

So hab ich die Position jetzt berechnet und es funktioniert auch wunderbar :)

Dann wäre vorerst nur noch die Frage nach dem Alphakanal offen. Wie gesagt speichert Photoshop diesen irgendwie nicht richtig in die TGA-Datei...

ph4nt0m

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

02.01.2007, 15:31

invertier den alphakanal halt einfach, wenn es dort wo's schwarz sein sollte weiß ist...

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

9

02.01.2007, 15:42

Nein, es soll da auch nicht schwarz sein. Ich hab mich da eventuell etwas undeutlich ausgedrückt: Das eigentliche Objekt im Bild hat abgerundete Ecken. Wenn ich jetzt einfach alle weißen Pixel (also die, die außerhalb liegen und nicht zum Bild gehören) transparent mache, dann ist zwar der Großteil schon weg, aber die Übergangspixel zum Objekt, die die "Rundungen" so schön weich erscheinen lassen, haben ja alle unterschiedliche Farbwerte und sind außerdem abhängig vom Hintergrund.

Diese Informationen werden bei PNGs im Alphakanal gespeichert und TGA hat so eine Unterstützung eigentlich auch. Nur will mein Photoshop das irgendwie nicht speichern...

ph4nt0m

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

02.01.2007, 15:44

die frage ist, wie viel bit hatte der alphakanal im png?
der im tga hat 8, daher können auch "weiche" abstufungen gespeichert werden.
bei png gibts afaik z.b. auch 1 bit alphakanal und da gibts keine weichen abstufungen.
wenn das original png also nur 1 bit alpha hatte, dann kann das tga nicht auf einmal eine bessere qualität haben...

EDIT: ok es scheint ich war da falsch informiert bezüglich des alphakanals in png, der hat dort auch min 8 bit.
liegt es nur am speichern, also hast du die korrekte alpha information in photoshop?

Werbeanzeige