在DDS文件中,您可以检测0/1位的纹理吗?


1

在我的引擎中,我需要能够检测具有0 alpha的纹素的DXT1纹理(例如窗框的切口)。这对我自己压缩的纹理来说很简单,但我不确定已压缩的纹理。

有没有一种简单的方法可以从头文件中判断DDS图像是否包含alpha?

2

据我所知,没有办法从标题中知道。有一个DDPF_ALPHAPIXELS标志,但我不认为这将根据像素数据中的内容进行设置。您需要解析DXT1块,并查找其中有0个alpha的颜色(确保检查块中实际使用的颜色,我想也是这样)。


0

我同意接受的答案。通过使用“挤压”库为您解压缩块,可以使您的工作变得更容易。

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


0

DDS为DXT(或BTC)数据非常差的包装。标题不会帮助你。 纯原件DXT1没有任何alpha。我相信现在d3d确实用alpha来解码DXT1。每个DXT1块都如下所示:color1(16位)color2(16位)索引(32位)。如果16位color1值小于color2(只是一个uint16比较,没有什么奇怪的!)该块没有alpha。否则它。所以回答你的问题:跳过标题,读16位a,读16位b,如果a> b有alpha。否则跳过32位并重复,直到eof。其他DXT格式,如DXT5总是有alpha。人们依靠DXT1 alpha技巧是非常罕见的,因为某些hw(intel ..)不能可靠地支持它。


0

不,DDS标头仅对未压缩的图像使用alpha标志。我也有类似的需要弄清楚如果DXT1图像使用1位字母和一个长的搜索后,我碰到这个参考这里走来:https://msdn.microsoft.com/en-us/library/windows/desktop/bb147243(v=vs.85).aspx

基本上如果color_0 < = color_1那么有质感有1个的可能性 - 位阿尔法。为了进一步验证它,如果它们是11,则需要检查2位对中的下一个32位。如果没有找到,则继续为每个块继续此操作。