Frage

In meiner Engine muss ich DXT1-Texturen erkennen können, die Texel mit 0 Alpha haben (z. B.ein Ausschnitt für einen Fensterrahmen).Dies ist bei Texturen, die ich selbst komprimiere, einfach, aber bei Texturen, die bereits komprimiert sind, bin ich mir nicht sicher.

Gibt es eine einfache Möglichkeit, anhand des Headers zu erkennen, ob ein DDS-Bild Alpha enthält?

War es hilfreich?

Lösung

Soweit ich weiß, kann man das anhand der Kopfzeile nicht erkennen.Es gibt ein DDPF_ALPHAPIXELS-Flag, aber ich glaube nicht, dass es basierend auf den Pixeldaten gesetzt wird.Sie müssten die DXT1-Blöcke analysieren und nach Farben suchen, die 0 Alpha enthalten (und dabei vermutlich auch überprüfen, ob die Farbe tatsächlich im Block verwendet wird).

Andere Tipps

Ich stimme der akzeptierten Antwort zu.Ihre Arbeit wird möglicherweise etwas einfacher, wenn Sie die „squish“-Bibliothek verwenden, um die Blöcke für Sie zu dekomprimieren.

http://www.sjbrown.co.uk/?code=squish

DDS ist ein sehr schlechter Wrapper für DXT- (oder BTC-)Daten.Der Header wird Ihnen nicht weiterhelfen.Das einfache Original DXT1 hatte kein Alpha.Ich glaube jedoch, dass d3d heutzutage DXT1 tatsächlich mit Alpha dekodiert.Jeder DXT1-Block sieht so aus:Farbe1 (16 Bit) Farbe2 (16 Bit) Indizes (32 Bit).Wenn der 16-Bit-Wert von Farbe1 kleiner als Farbe2 ist (nur ein uint16-Vergleich, nichts Besonderes!), hat der Block kein Alpha.Sonst tut es das.Um Ihre Frage zu beantworten:Überspringen Sie den Header, lesen Sie 16 Bit a, lesen Sie 16 Bit b. Wenn a> b, gibt es Alpha.Andernfalls überspringen Sie 32 Bits und wiederholen Sie den Vorgang bis eof.Andere DXT-Formate wie DXT5 haben immer Alpha.Es kommt sehr selten vor, dass man sich auf den DXT1-Alpha-Trick verlässt, weil einige Hardware (Intel...) ihn nicht zuverlässig unterstützt.

Nein, der DDS-Header verwendet Alpha-Flags nur für unkomprimierte Bilder.Ich hatte ein ähnliches Bedürfnis herauszufinden, ob ein DXT1-Bild 1-Bit-Alpha verwendet, und nach langer Suche bin ich hier auf diesen Hinweis gestoßen: https://msdn.microsoft.com/en-us/library/windows/desktop/bb147243(v=vs.85).aspx

Grundsätzlich besteht, wenn color_0 <= color_1, die Möglichkeit, dass die Textur 1-Bit-Alpha hat.Um dies weiter zu überprüfen, müssen Sie die nächsten 32 Bits in 2-Bit-Paaren überprüfen, ob sie 11 sind.Fahren Sie dann für jeden Block fort, wenn dieser nicht gefunden wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top