DDS Format
-
Hi!
Schreibe z. Z. einen Loader für das DDS Format. Siehe hirzu die M$ Specs:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/reference/DDSFileReference/ddsfileformat.aspMein Loader soll komprimierte, unkmomprimierte DDS Dateien, mit oder ohne Cubemaps mit oder ohne MIPMaps laden können. Es entfällt also Support für 3D Texturen und bedingt durch OpenGL die komrpimierten Formate DXT2 und DXT4.
Das Problem ist bei unkomprimierten DDS Texturen ist, das die Farbkanäle irgendwie vertauscht sind.
Im DirectDraw PixelFormat vom Typ DDPIXELFORMAT (siehe Link) gibt es diese Bitmasken für die einzelnen Farbkanäle. Wie sind diese anzuwenden?
Rot = Farbe & RotMaske
Grün = Farbe & GrünMaske
Blau = Farbe & BlauMaske
Alpha = Farbe & AlphaMaske
???Hier mal der Debuggerauszug aus einer unkomprimierten DDS Datei mit 24 Bit Farbtiefe (und 10 MIPMaps)
http://www.blitz-pasting.net/uploads/useruploads/iFXgk124455971112_dds.gifMit diesen Vorgehen, würde ja der Grün- und Blauanteil 0 werden.
mfg olli
-
ich hätte jetzt nur ne theorie.
kann es sein, dass du die Bitmasken nicht korrekt einliest?
bei 24Bit farbtiefe hast du 3 byte verfügbar + alpha.
rein logisch würde ich das ganze wie folgt aufbaun:RRGGBBAA FF000000 //für rot 00FF0000 //für grün 0000FF00 //für blau 000000FF //für alphabei dem debug-auszug steht für rot: 255, grün, blau und alpha: 0 -> FF-00-00-00
kann sein, dass du nur den ersten kanal gelsen hast? (byteweise, obwohl ein kanal 4-byte lang is.also is nur ne theorie....
heimschmiede
-
falls du das nicht rein zu lernzwecken machst, auf der nv seite müßte ein loader sein der es dir erlauben müßte es ohne probs in oGL einzubauen.
rapso->greets();
-
Heimschmiede:
' DirectDraw PixelFormat Type TDDS_DDPIXELFORMAT Field Size : Int Field Flags : Int Field FourCC : Int Field RGBBitCount : Int Field RBitMask : Int Field GBitMask : Int Field BBitMask : Int Field RGBAlphaBitMask : Int Method Read(Stream:TStream) Self.Size = Stream.ReadInt() Self.Flags = Stream.ReadInt() Self.FourCC = Stream.ReadInt() Self.RGBBitCount = Stream.ReadInt() Self.RBitMask = Stream.ReadInt() Self.RBitMask = Stream.ReadInt() Self.RBitMask = Stream.ReadInt() Self.RGBAlphaBitMask = Stream.ReadInt() End Method End Type(sorry, ist BlitzMax Code)
Aber er liest die Header auf jedenfall korrekt aus. Sind ja alles nur DWORD Werte(Int in BlitzMax).
Bei mir geht dieses NVIDIA Plugin für Photoshop leider nicht(Installation geht, aber dann weiter?). Deswegen benutze ich die DDS Dateien aus den Cg Tutorial Ding von NVIDIA. Kann sein, das diese Fehlerhaft sind.
rapso: Naja, ist ne eigene kleine 3D Engine. Aber wenn du mir sagen kannst, wo es den Source zum Loader gibt

Mein Loader sieht so aus:
http://vertex.art-fx.org/dreide257.zip (DDSLoader.bmx)mfg olli