Domanda

Nel mio motore ho bisogno di essere in grado di rilevare texture DXT1 che hanno texel con 0 alfa (ad es.un ritaglio per il telaio di una finestra).Questo è facile per le texture che comprimo da solo, ma non sono sicuro delle texture già compresse.

Esiste un modo semplice per capire dall'intestazione se un'immagine DDS contiene alfa?

È stato utile?

Soluzione

Per quanto ne so, non c'è modo di capirlo dall'intestazione.C'è un flag DDPF_ALPHAPIXELS, ma non penso che verrà impostato in base a cosa c'è nei dati dei pixel.Dovresti analizzare i blocchi DXT1 e cercare i colori che contengono 0 alfa (assicurandoti di verificare che anche il colore sia effettivamente utilizzato nel blocco, suppongo).

Altri suggerimenti

Sono d'accordo con la risposta accettata.Il tuo lavoro potrebbe essere reso un po' più semplice utilizzando la libreria "squish" per decomprimere i blocchi per te.

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

DDS è un wrapper molto scadente per i dati DXT (o BTC).L'intestazione non ti aiuterà.Il semplice DXT1 originale non aveva alcun alfa.Credo però che d3d al giorno d'oggi decodifichi effettivamente DXT1 con alpha.Ogni blocco DXT1 si presenta così:color1(16 bit) color2(16 bit) indici(32 bit).Se il valore color1 a 16 bit è inferiore a color2 (solo un confronto uint16, niente di speciale!) il blocco non ha alfa.Altrimenti lo fa.Quindi per rispondere alla tua domanda:Salta l'intestazione, leggi 16 bit a, leggi 16 bit b, se a>b c'è alfa.altrimenti salta 32 bit e ripeti fino a eof.Altri formati DXT come DXT5 hanno sempre alfa.È molto raro che le persone facciano affidamento sul trucco alfa DXT1 perché alcuni hw (intelligence..) non lo supportano in modo affidabile.

No, l'intestazione DDS utilizza solo i flag alfa per le immagini non compresse.Avevo un'esigenza simile per capire se un'immagine DXT1 utilizzava l'alfa a 1 bit e dopo una lunga ricerca mi sono imbattuto in questo riferimento qui: https://msdn.microsoft.com/en-us/library/windows/desktop/bb147243(v=vs.85).aspx

Fondamentalmente se color_0 <= color_1 allora c'è la possibilità che la texture abbia un alfa a 1 bit.Per verificarlo ulteriormente, è necessario controllare i successivi 32 bit in coppie di 2 bit se sono 11.Quindi continua così per ogni blocco se non trovato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top