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.asp

    Mein 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.gif

    Mit 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 alpha
    

    bei 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


  • Mod

    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


Anmelden zum Antworten