Pergunta

No meu mecanismo, preciso detectar texturas DXT1 que possuem texels com 0 alfa (por exemplo,um recorte para uma moldura de janela).Isso é fácil para texturas que eu mesmo comprimo, mas não tenho certeza sobre texturas que já estão compactadas.

Existe uma maneira fácil de saber pelo cabeçalho se uma imagem DDS contém alfa?

Foi útil?

Solução

Pelo que eu sei, não há como saber pelo cabeçalho.Há um sinalizador DDPF_ALPHAPIXELS, mas não acho que será definido com base no que está nos dados de pixel.Você precisaria analisar os blocos DXT1 e procurar cores que tenham 0 alfa (certificando-se de verificar se a cor também é usada no bloco, suponho).

Outras dicas

Eu concordo com a resposta aceita.Seu trabalho pode ficar um pouco mais fácil usando a biblioteca "squish" para descompactar os blocos para você.

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

DDS é um wrapper muito ruim para dados DXT (ou BTC).O cabeçalho não irá ajudá-lo.O DXT1 original simples não tinha nenhum alfa.Acredito que hoje em dia o d3d realmente decodifica o DXT1 com alfa.Cada bloco DXT1 se parece com isto:color1(16 bits) color2(16 bits) índices(32 bits).Se o valor color1 de 16 bits for menor que color2 (apenas uma comparação uint16, nada sofisticado!), o bloco não terá alfa.Caso contrário, acontece.Então, para responder à sua pergunta:Pule o cabeçalho, leia 16 bits a, leia 16 bits b, se a>b houver alfa.caso contrário, pule 32 bits e repita até eof.Outros formatos DXT como DXT5 sempre possuem alfa.É muito raro que as pessoas confiem no truque alfa do DXT1 porque alguns hw (intel..) não o suportam de forma confiável.

Não, o cabeçalho DDS usa apenas sinalizadores alfa para imagens não compactadas.Eu tive uma necessidade semelhante de descobrir se uma imagem DXT1 estava usando alfa de 1 bit e depois de uma longa pesquisa me deparei com esta referência aqui: https://msdn.microsoft.com/en-us/library/windows/desktop/bb147243(v=vs.85).aspx

Basicamente, se color_0 <= color_1, existe a possibilidade de a textura ter alfa de 1 bit.Para verificar ainda mais, você precisa verificar os próximos 32 bits em pares de 2 bits, se forem 11.Em seguida, continue assim para cada bloco, se não for encontrado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top