In einer DDS-Datei können Sie Texturen mit 0/1 Alpha-Bits erkennen?


1

In meiner Engine muss ich in der Lage sein, DXT1 Texturen zu erkennen, die Texel mit 0 Alpha haben (z. B. ein Ausschnitt für einen Fensterrahmen). Das ist leicht für Texturen, die ich selbst komprimiere, aber ich bin mir nicht sicher über Texturen, die bereits komprimiert sind.

Gibt es eine einfache Möglichkeit, aus der Kopfzeile zu erkennen, ob ein DDS-Bild Alpha enthält?

2

Soweit ich weiß, gibt es keine Möglichkeit, aus dem Header zu erkennen. Es gibt ein DDPF_ALPHAPIXELS-Flag, aber ich denke 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 (achten Sie darauf, dass die Farbe auch tatsächlich im Block verwendet wird, nehme ich an).


0

Ich stimme der akzeptierten Antwort zu. Ihr Job könnte ein bisschen einfacher werden, wenn Sie die Blöcke für Sie mit der "squish" -Bibliothek dekomprimieren.

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


0

DDS ist ein sehr armes Wrapper für DXT (oder BTC) Daten. Der Header wird dir nicht helfen. Plain Original DXT1 hatte kein Alpha. Ich glaube, dass d3d heutzutage tatsächlich DXT1 mit Alpha dekodiert. Jeder DXT1-Block sieht so aus: color1 (16 Bit) color2 (16 Bit) Indices (32 Bit). Wenn der 16-Bit-color1-Wert kleiner als color2 ist (nur ein Uint16-Vergleich, nichts Besonderes!), Hat der Block kein Alpha. Sonst tut es. Also um deine Frage zu beantworten: Überspringe die Kopfzeile, lese 16 Bits a, lese 16 Bits b, wenn a> b da ist Alpha. Ansonsten 32 Bit überspringen und bis eof wiederholen. Andere DXT-Formate wie DXT5 haben immer Alpha. Es ist sehr selten, dass Leute sich auf den DXT1-Alpha-Trick verlassen, weil einige hw (Intel ..) es nicht zuverlässig unterstützt.


0

Nein, der DDS-Header verwendet nur Alpha-Flags für unkomprimierte Bilder. Ich hatte ein ähnliches Bedürfnis, herauszufinden, ob ein DXT1 Bild wurde mit dem 1-Bit-Alpha und nach einer langen Suche ich auf diese Referenz kam hier: https://msdn.microsoft.com/en-us/library/windows/desktop/bb147243(v=vs.85).aspx

Grundsätzlich, wenn color_0 < = color_1 dann gibt es eine Möglichkeit, die Textur 1 hat -Bit Alpha. Um es weiter zu überprüfen, müssen Sie die nächsten 32-Bit in 2-Bit-Paaren überprüfen, wenn sie 11 sind. Dann weiter für jeden Block, wenn nicht gefunden.